1. 程式人生 > >QT的自動滾動區QScrollArea的用法,圖文詳解

QT的自動滾動區QScrollArea的用法,圖文詳解

QScrollArea屬於控制元件容器類,可以直接在ui中拖出來。

對於QScrollArea,最難搞懂的就是:如何控制它,才能讓它在我們想要出現滾動條的時候出現滾動條。

我們拖入一個QScrollArea,再向他裡面拖入4個button,觀察資訊如下:

可以發現,4個button並不是直接位於QScrollArea中的,而是位於它的成員scorllAreaWidgetContents中的,這個成員的型別也是控制元件型別QWidget,也就是說,QScrollArea這個容器本身就套了兩層,我們放入的按鈕等控制元件,都處在scrllAreaWidgetContents層。

補充一點,內層的這個scrllAreaWidgetContents,我們可以更換掉它,方法就是QScrollArea::setWidget(QWidget *),也就是說,scrllAreaWidgetContents只是QScrollArea的一個預設內建QWidget,我們可以隨時可以用別的QWidget或者子類物件替換掉scrllAreaWidgetContents。

下面講如何控制滾動條何時出現?

有了上面的分析,我們已經知道了QScrollArea有兩層,QScrollArea本身是個QWidget,它內部又套了一個小QWidget。在預設情況下,內部的這個小QWidget,也即scorllAreaWidgetContents成員,它的大小總是等於外部QWidget(也即QScrollArea)的大小。除非我們給scorllAreaWidgetContents設定了寬高的最小值,這時,當QScrollArea的寬或高,一旦小於scorllAreaWidgetContents的寬或高,就會出現滾動條。

直接看例子,我給scorllAreaWidgetContents成員設定寬高最小值為500*1000,這麼高的scorllAreaWidgetContents,顯然QScrollArea在高度上是無法容納下的。實際上,看效果發現,還沒有執行程式,就已經有滾動條了:

我們執行一下程式,然後把視窗縮小,看看是不是當視窗<scorllAreaWidgetContents最小值500*1000時,會自動出現水平滾動條。看下圖發現,並沒有出現我們期望的效果。

原因就是,水平滾動條,只有當QScrollArea<內部的QWidget時,才會出現,顯然上圖中,QScrollArea雖然沒顯示全,但是QScrollArea的寬度仍然保持原值,只是被遮住了而已。要想使QScrollArea的寬度變小,要麼通過程式直接修改,要麼通過設定佈局,使QScrollArea的寬度隨窗體的寬度減小而減小。我們這裡就簡單一點,直接給窗體設定網格佈局:,使得QScrollArea的大小受窗體大小驅動。執行起來,再看下效果:

再補充幾點:

內部的小QWidget與QScrollArea的關係,就像是給QScrollArea設定了網格佈局,然後把小QWidget放進了這個佈局中,如果給小QWidget設定的最大寬高<QScrollArea的實時大小,那麼QScrollArea會顯示出空白,而空白部分是無法放置/顯示我們自己拖入的控制元件的,如下圖:

如果我們不給小QWidget設定寬高最大值,那麼它的寬width將滿足:

,它的高也有與之相同的規律。

知道了原理,不論是用UI設計器來做介面,還是直接用程式碼來做介面,就都不是問題了。如有疑問,請留言討論。