QScrollArea屬于控件容器類,可以直接在ui中拖出來。
對于QScrollArea,最難搞懂的就是:如何控制它,才能讓它在我們想要出現(xiàn)滾動條的時候出現(xiàn)滾動條。 我們拖入一個QScrollArea,再向他里面拖入4個button,觀察信息如下: 可以發(fā)現(xiàn),4個button并不是直接位于QScrollArea中的,而是位于它的成員scorllAreaWidgetContents中的,這個成員的類型也是控件類型QWidget,也就是說,QScrollArea這個容器本身就套了兩層,我們放入的按鈕等控件,都處在scrllAreaWidgetContents層,下文中我把QScrollArea.widget統(tǒng)一稱之為“內(nèi)部容器”或者"內(nèi)容層",內(nèi)部容器是QScrollArea這個控件的子控件。 "內(nèi)容層"相當于一塊很大的幕布,按鈕、label等控件都被繪制在了幕布上,而QScrollArea相當于一個小窗口,透過這個小窗口我們看一看到幕布上的一小部分內(nèi)容,拖動滾動條相當于在窗口后面移動幕布,這樣我們就能透過窗口看到幕布上不同位置的內(nèi)容。 這個幕布本質(zhì)上就是一個QWidget,如果QScrollArea是從UI設計師界面拖出來的,那么QT會自動為我們創(chuàng)建這個幕布,如果你是用代碼new出來的QScrollArea,那么不要忘記同時new一個幕布widget,并通過QScrollArea::setWidget(QWidget *)把幕布和QScrollArea關(guān)聯(lián)起來。 這里有一個坑,如果你寫了一個功能更強的QScrollArea的子類,假設叫QScrollAreaEx(里面自帶幕布,幕布中自帶一些按鈕什么的),在ui設計師界面把QScrollArea提升為QScrollAreaEx的時候,你會發(fā)現(xiàn),按鈕并沒有顯示出來,why?因為QT自動生成的ui代碼中,new了一個幕布控件,并把這個空的幕布賦給了QScrollAreaEx對象,這真是太坑了。解決方案有兩種,①自己用代碼new QScrollAreaEx,②在ui中拖出一個非QScrollArea的QWidget控件,然后提升為QScrollAreaEx。
一旦理解了幕布和觀察窗口的關(guān)系,就能很容易的總結(jié)出QScrollArea的標準編程步驟,分這么幾種情況:
(1)new QscrollArea
只做上一種情形的步驟(3)(4)(5)即可。
這種情形不用寫代碼,只要在滾動區(qū)域把控件擺放好,然后使用任意一種布局即可,如下2圖所示:
只要幕布控件scorllAreaWidgetContents的大小超過了QScrollArea的大小,就會自動出現(xiàn)滾動條;如果幕布比觀察窗口還小,那就不會出現(xiàn)滾動條。
最后再看幾個實例, 我給scorllAreaWidgetContents成員設置寬高最小值為500*1000,這么高的scorllAreaWidgetContents,顯然QScrollArea在高度上是無法容納下的。實際上,看效果發(fā)現(xiàn),還沒有運行程序,就已經(jīng)有滾動條了:
我們運行一下程序,然后把窗口縮小,看看是不是當窗口<scorllAreaWidgetContents最小值500*1000時,會自動出現(xiàn)水平滾動條??聪聢D發(fā)現(xiàn),并沒有出現(xiàn)我們期望的效果。 , 原因就是,水平滾動條,只有當QScrollArea<內(nèi)部的QWidget時,才會出現(xiàn),顯然上圖中,QScrollArea雖然沒顯示全,但是QScrollArea的寬度仍然保持原值,只是被遮住了而已。要想使QScrollArea的寬度變小,要么通過程序直接修改,要么通過設置布局,使QScrollArea的寬度隨窗體的寬度減小而減小。我們這里就簡單一點,直接給窗體設置網(wǎng)格布局:,使得QScrollArea的大小受窗體大小驅(qū)動。運行起來,再看下效果: 再補充幾點: 內(nèi)部的小QWidget與QScrollArea的關(guān)系,就像是給QScrollArea設置了網(wǎng)格布局,然后把小QWidget放進了這個布局中,如果給小QWidget設置的最大寬高<QScrollArea的實時大小,那么QScrollArea會顯示出空白,而空白部分是無法放置/顯示我們自己拖入的控件的,如下圖:
技巧: 通過上述操作,我們知道了,我們可以通過設置內(nèi)部小QWidget的寬、高最小值,來讓外部QScrollArea適時的出現(xiàn)滾動條,那么到底把小QWidget的寬、高最小值設置為多少合適呢? 答案是顯然的:把小QWidget的寬、高最小值設置為剛好能容納內(nèi)部的按鈕等控件,這樣看起來最舒服。難道我要先計算或者觀察一下按鈕等控件占用的面積之后,才能去設置小QWidget的寬、高最小值嗎? 這樣做太費勁了,我們肯定不會去這樣做,除非是用ui設計師拖控件時,所見即所得,才無需計算小QWidget的寬、高最小值。用代碼寫界面時,最好的做法是: 1、向小QWidget中添加按鈕等控件時,隨著添加的按鈕增多,小QWidget自動變大,顯然用QGridLayout來做就能實現(xiàn)這個自動增大這個需求。自動增大也只是出現(xiàn)創(chuàng)建內(nèi)部容器階段,一旦內(nèi)部容器和布局、布局內(nèi)的控件都創(chuàng)建和添加完畢,后續(xù)即使再向布局中添加控件,內(nèi)部容器也不會自動增大了,這時只有靠setGeometry或者resize手動修改內(nèi)部容器的大小了。 2、添加完控件后,手動調(diào)用一下adjustSize函數(shù),該函數(shù)會根據(jù)所有子控件的大小之和,來調(diào)整父控件的大小。 步驟如下:先在ui中拖入一個QScrollArea控件,名字為scrollArea,然后添加代碼:
再來一個多行多列的例子:
|
|