這篇文章主要介紹Qt圖形圖像開發(fā)之QT滾動(dòng)區(qū)控件QScrollArea怎么用,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
滾動(dòng)區(qū)域控件QScrollArea用于顯示一個(gè)畫面中的子部件的內(nèi)容。如果部件超過(guò)畫面的大小,視圖可以提供滾動(dòng)條,這樣就可以看到部件的整個(gè)區(qū)域。
QScrollArea屬于控件容器類,可以直接在ui中拖出來(lái)。
對(duì)于QScrollArea,最難搞懂的就是:如何控制它,才能讓它在我們想要出現(xiàn)滾動(dòng)條的時(shí)候出現(xiàn)滾動(dòng)條。
我們拖入一個(gè)QScrollArea,再向他里面拖入4個(gè)button,觀察信息如下:
可以發(fā)現(xiàn),4個(gè)button并不是直接位于QScrollArea中的,而是位于它的成員scorllAreaWidgetContents中的,這個(gè)成員的類型也是控件類型QWidget,也就是說(shuō),QScrollArea這個(gè)容器本身就套了兩層,我們放入的按鈕等控件,都處在scrllAreaWidgetContents層,下文中我把QScrollArea.widget統(tǒng)一稱之為“內(nèi)部容器”或者"內(nèi)容層",內(nèi)部容器是QScrollArea這個(gè)控件的子控件。
"內(nèi)容層"相當(dāng)于一塊很大的幕布,按鈕、label等控件都被繪制在了幕布上,而QScrollArea相當(dāng)于一個(gè)小窗口,透過(guò)這個(gè)小窗口我們看一看到幕布上的一小部分內(nèi)容,拖動(dòng)滾動(dòng)條相當(dāng)于在窗口后面移動(dòng)幕布,這樣我們就能透過(guò)窗口看到幕布上不同位置的內(nèi)容。
這個(gè)幕布本質(zhì)上就是一個(gè)QWidget,如果QScrollArea是從UI設(shè)計(jì)師界面拖出來(lái)的,那么QT會(huì)自動(dòng)為我們創(chuàng)建這個(gè)幕布,如果你是用代碼new出來(lái)的QScrollArea,那么不要忘記同時(shí)new一個(gè)幕布widget,并通過(guò)QScrollArea::setWidget(QWidget *)把幕布和QScrollArea關(guān)聯(lián)起來(lái)。
這里有一個(gè)坑,如果你寫了一個(gè)功能更強(qiáng)的QScrollArea的子類,假設(shè)叫QScrollAreaEx(里面自帶幕布,幕布中自帶一些按鈕什么的),在ui設(shè)計(jì)師界面把QScrollArea提升為QScrollAreaEx的時(shí)候,你會(huì)發(fā)現(xiàn),按鈕并沒(méi)有顯示出來(lái),why?因?yàn)镼T自動(dòng)生成的ui代碼中,new了一個(gè)幕布控件,并把這個(gè)空的幕布賦給了QScrollAreaEx對(duì)象,這真是太坑了。解決方案有兩種,①自己用代碼new QScrollAreaEx,②在ui中拖出一個(gè)非QScrollArea的QWidget控件,然后提升為QScrollAreaEx。
一旦理解了幕布和觀察窗口的關(guān)系,就能很容易的總結(jié)出QScrollArea的標(biāo)準(zhǔn)編程步驟,分這么幾種情況:
(1) new QscrollArea
(2) new 內(nèi)部的幕布容器
(3) new 布局,例如網(wǎng)格布局QGridLayout(前3步不分先后順序)或者你想用的其他布局
(4) 向布局中添加你想要的控件(這一步必須位于步驟3之后,這不是廢話嗎)
(5) 關(guān)聯(lián)"幕布控件"和"布局"(如果在創(chuàng)建布局時(shí),就把布局構(gòu)造在了幕布控件中,那么這一步就省了)
(6) 給QScroolArea設(shè)置幕布,也即調(diào)用QScrollArea::setWidget(QWidget *),這一步必須位于步驟4、5之后。
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QHBoxLayout> #include <QPushButton> #include <QScrollArea> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QScrollArea * scrollArea = new QScrollArea(this); QWidget * pWgt = new QWidget; QHBoxLayout *pLayout = new QHBoxLayout();//網(wǎng)格布局 for(int i = 0; i < 100; i++) { QPushButton *pBtn = new QPushButton(); pBtn->setText(QString("按鈕%1").arg(i)); pBtn->setMinimumSize(QSize(60,30)); //width height pLayout->addWidget(pBtn);//把按鈕添加到布局控件中 } pWgt->setLayout(pLayout); //這一句setWidget必須放在pWgt里面的內(nèi)容都準(zhǔn)備完畢之后,否則顯示有問(wèn)題 scrollArea->setWidget(pWgt); setCentralWidget(scrollArea); } MainWindow::~MainWindow() { delete ui; }
滾動(dòng)區(qū)里面的控件是代碼new的,那么編程步驟如下:
只做上一種情形的步驟(3)(4)(5)即可。
這種情形不用寫代碼,只要在滾動(dòng)區(qū)域把控件擺放好,然后使用任意一種布局即可,如下2圖所示:
只要幕布控件scorllAreaWidgetContents的大小超過(guò)了QScrollArea的大小,就會(huì)自動(dòng)出現(xiàn)滾動(dòng)條;如果幕布比觀察窗口還小,那就不會(huì)出現(xiàn)滾動(dòng)條。
最后再看幾個(gè)實(shí)例
我給scorllAreaWidgetContents成員設(shè)置寬高最小值為500*1000,這么高的scorllAreaWidgetContents,顯然QScrollArea在高度上是無(wú)法容納下的。實(shí)際上,看效果發(fā)現(xiàn),還沒(méi)有運(yùn)行程序,就已經(jīng)有滾動(dòng)條了:
我們運(yùn)行一下程序,然后把窗口縮小,看看是不是當(dāng)窗口<scorllAreaWidgetContents最小值500*1000時(shí),會(huì)自動(dòng)出現(xiàn)水平滾動(dòng)條。看下圖發(fā)現(xiàn),并沒(méi)有出現(xiàn)我們期望的效果。
原因就是,水平滾動(dòng)條,只有當(dāng)QScrollArea<內(nèi)部的QWidget時(shí),才會(huì)出現(xiàn),顯然上圖中,QScrollArea雖然沒(méi)顯示全,但是QScrollArea的寬度仍然保持原值,只是被遮住了而已。要想使QScrollArea的寬度變小,要么通過(guò)程序直接修改,要么通過(guò)設(shè)置布局,使QScrollArea的寬度隨窗體的寬度減小而減小。我們這里就簡(jiǎn)單一點(diǎn),直接給窗體設(shè)置網(wǎng)格布局:
使得QScrollArea的大小受窗體大小驅(qū)動(dòng)。運(yùn)行起來(lái),再看下效果:
再補(bǔ)充幾點(diǎn):
內(nèi)部的小QWidget與QScrollArea的關(guān)系,就像是給QScrollArea設(shè)置了網(wǎng)格布局,然后把小QWidget放進(jìn)了這個(gè)布局中,如果給小QWidget設(shè)置的大寬高<QScrollArea的實(shí)時(shí)大小,那么QScrollArea會(huì)顯示出空白,而空白部分是無(wú)法放置/顯示我們自己拖入的控件的,如下圖:
技巧:
通過(guò)上述操作,我們知道了,我們可以通過(guò)設(shè)置內(nèi)部小QWidget的寬、高最小值,來(lái)讓外部QScrollArea適時(shí)的出現(xiàn)滾動(dòng)條,那么到底把小QWidget的寬、高最小值設(shè)置為多少合適呢?
答案是顯然的:把小QWidget的寬、高最小值設(shè)置為剛好能容納內(nèi)部的按鈕等控件,這樣看起來(lái)最舒服。難道我要先計(jì)算或者觀察一下按鈕等控件占用的面積之后,才能去設(shè)置小QWidget的寬、高最小值嗎?
這樣做太費(fèi)勁了,我們肯定不會(huì)去這樣做,除非是用ui設(shè)計(jì)師拖控件時(shí),所見即所得,才無(wú)需計(jì)算小QWidget的寬、高最小值。用代碼寫界面時(shí),最好的做法是:
1、向小QWidget中添加按鈕等控件時(shí),隨著添加的按鈕增多,小QWidget自動(dòng)變大,顯然用QGridLayout來(lái)做就能實(shí)現(xiàn)這個(gè)自動(dòng)增大這個(gè)需求。自動(dòng)增大也只是出現(xiàn)創(chuàng)建內(nèi)部容器階段,一旦內(nèi)部容器和布局、布局內(nèi)的控件都創(chuàng)建和添加完畢,后續(xù)即使再向布局中添加控件,內(nèi)部容器也不會(huì)自動(dòng)增大了,這時(shí)只有靠setGeometry或者resize手動(dòng)修改內(nèi)部容器的大小了。
2、添加完控件后,手動(dòng)調(diào)用一下adjustSize函數(shù),該函數(shù)會(huì)根據(jù)所有子控件的大小之和,來(lái)調(diào)整父控件的大小。
步驟如下:先在ui中拖入一個(gè)QScrollArea控件,名字為scrollArea,然后添加代碼:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QGridLayout *pLayout = new QGridLayout();//網(wǎng)格布局 for(int i = 0; i < 100; i++) { QPushButton *pBtn = new QPushButton(); pBtn->setText(QString("按鈕%1").arg(i)); pBtn->setMinimumSize(QSize(60,30)); //width height pLayout->addWidget(pBtn);//把按鈕添加到布局控件中 } ui->scrollArea->widget()->setLayout(pLayout);//把布局放置到QScrollArea的內(nèi)部QWidget中 }
以上是“Qt圖形圖像開發(fā)之QT滾動(dòng)區(qū)控件QScrollArea怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.chinadenli.net,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
名稱欄目:Qt圖形圖像開發(fā)之QT滾動(dòng)區(qū)控件QScrollArea怎么用-創(chuàng)新互聯(lián)
轉(zhuǎn)載來(lái)于:http://www.chinadenli.net/article34/dpdspe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、電子商務(wù)、App設(shè)計(jì)、靜態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化、動(dòng)態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容