Qt圖形圖像開發(fā)之QT滾動區(qū)控件QScrollArea怎么用-創(chuàng)新互聯

這篇文章主要介紹Qt圖形圖像開發(fā)之QT滾動區(qū)控件QScrollArea怎么用,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

我們擁有十余年網頁設計和網站建設經驗,從網站策劃到網站制作,我們的網頁設計師為您提供的解決方案。為企業(yè)提供網站制作、做網站、微信開發(fā)、微信小程序、手機網站制作、H5技術、等業(yè)務。無論您有什么樣的網站設計或者設計方案要求,我們都將富于創(chuàng)造性的提供專業(yè)設計服務并滿足您的需求。

QT滾動區(qū)控件(滾動條控件)QScrollArea簡介

滾動區(qū)域控件QScrollArea用于顯示一個畫面中的子部件的內容。如果部件超過畫面的大小,視圖可以提供滾動條,這樣就可以看到部件的整個區(qū)域。

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

Qt圖形圖像開發(fā)之QT滾動區(qū)控件QScrollArea怎么用

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

我們拖入一個QScrollArea,再向他里面拖入4個button,觀察信息如下:

Qt圖形圖像開發(fā)之QT滾動區(qū)控件QScrollArea怎么用

可以發(fā)現,4個button并不是直接位于QScrollArea中的,而是位于它的成員scorllAreaWidgetContents中的,這個成員的類型也是控件類型QWidget,也就是說,QScrollArea這個容器本身就套了兩層,我們放入的按鈕等控件,都處在scrllAreaWidgetContents層,下文中我把QScrollArea.widget統一稱之為“內部容器”或者"內容層",內部容器是QScrollArea這個控件的子控件。

"內容層"相當于一塊很大的幕布,按鈕、label等控件都被繪制在了幕布上,而QScrollArea相當于一個小窗口,透過這個小窗口我們看一看到幕布上的一小部分內容,拖動滾動條相當于在窗口后面移動幕布,這樣我們就能透過窗口看到幕布上不同位置的內容。

這個幕布本質上就是一個QWidget,如果QScrollArea是從UI設計師界面拖出來的,那么QT會自動為我們創(chuàng)建這個幕布,如果你是用代碼new出來的QScrollArea,那么不要忘記同時new一個幕布widget,并通過QScrollArea::setWidget(QWidget *)把幕布和QScrollArea關聯起來。

這里有一個坑,如果你寫了一個功能更強的QScrollArea的子類,假設叫QScrollAreaEx(里面自帶幕布,幕布中自帶一些按鈕什么的),在ui設計師界面把QScrollArea提升為QScrollAreaEx的時候,你會發(fā)現,按鈕并沒有顯示出來,why?因為QT自動生成的ui代碼中,new了一個幕布控件,并把這個空的幕布賦給了QScrollAreaEx對象,這真是太坑了。解決方案有兩種,①自己用代碼new QScrollAreaEx,②在ui中拖出一個非QScrollArea的QWidget控件,然后提升為QScrollAreaEx。

一旦理解了幕布和觀察窗口的關系,就能很容易的總結出QScrollArea的標準編程步驟,分這么幾種情況:

QScrollArea純代碼實現

(1) new QscrollArea

(2) new 內部的幕布容器

(3) new 布局,例如網格布局QGridLayout(前3步不分先后順序)或者你想用的其他布局

(4) 向布局中添加你想要的控件(這一步必須位于步驟3之后,這不是廢話嗎)

(5) 關聯"幕布控件"和"布局"(如果在創(chuàng)建布局時,就把布局構造在了幕布控件中,那么這一步就省了)

(6) 給QScroolArea設置幕布,也即調用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();//網格布局
    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里面的內容都準備完畢之后,否則顯示有問題
  scrollArea->setWidget(pWgt);
  setCentralWidget(scrollArea);
}
 
MainWindow::~MainWindow()
{
  delete ui;
}

QScrollArea是直接從ui里拖出來

滾動區(qū)里面的控件是代碼new的,那么編程步驟如下:

只做上一種情形的步驟(3)(4)(5)即可。

QScrollArea和它里面的控件都是直接在ui里拖出來的

這種情形不用寫代碼,只要在滾動區(qū)域把控件擺放好,然后使用任意一種布局即可,如下2圖所示:

Qt圖形圖像開發(fā)之QT滾動區(qū)控件QScrollArea怎么用

Qt圖形圖像開發(fā)之QT滾動區(qū)控件QScrollArea怎么用

一句話總結QScrollArea何時出現滾動條

只要幕布控件scorllAreaWidgetContents的大小超過了QScrollArea的大小,就會自動出現滾動條;如果幕布比觀察窗口還小,那就不會出現滾動條。

最后再看幾個實例

我給scorllAreaWidgetContents成員設置寬高最小值為500*1000,這么高的scorllAreaWidgetContents,顯然QScrollArea在高度上是無法容納下的。實際上,看效果發(fā)現,還沒有運行程序,就已經有滾動條了:

Qt圖形圖像開發(fā)之QT滾動區(qū)控件QScrollArea怎么用

我們運行一下程序,然后把窗口縮小,看看是不是當窗口<scorllAreaWidgetContents最小值500*1000時,會自動出現水平滾動條??聪聢D發(fā)現,并沒有出現我們期望的效果。

Qt圖形圖像開發(fā)之QT滾動區(qū)控件QScrollArea怎么用

原因就是,水平滾動條,只有當QScrollArea<內部的QWidget時,才會出現,顯然上圖中,QScrollArea雖然沒顯示全,但是QScrollArea的寬度仍然保持原值,只是被遮住了而已。要想使QScrollArea的寬度變小,要么通過程序直接修改,要么通過設置布局,使QScrollArea的寬度隨窗體的寬度減小而減小。我們這里就簡單一點,直接給窗體設置網格布局:

Qt圖形圖像開發(fā)之QT滾動區(qū)控件QScrollArea怎么用

使得QScrollArea的大小受窗體大小驅動。運行起來,再看下效果:

Qt圖形圖像開發(fā)之QT滾動區(qū)控件QScrollArea怎么用

再補充幾點:

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

Qt圖形圖像開發(fā)之QT滾動區(qū)控件QScrollArea怎么用

技巧:

通過上述操作,我們知道了,我們可以通過設置內部小QWidget的寬、高最小值,來讓外部QScrollArea適時的出現滾動條,那么到底把小QWidget的寬、高最小值設置為多少合適呢?

答案是顯然的:把小QWidget的寬、高最小值設置為剛好能容納內部的按鈕等控件,這樣看起來最舒服。難道我要先計算或者觀察一下按鈕等控件占用的面積之后,才能去設置小QWidget的寬、高最小值嗎?

這樣做太費勁了,我們肯定不會去這樣做,除非是用ui設計師拖控件時,所見即所得,才無需計算小QWidget的寬、高最小值。用代碼寫界面時,最好的做法是:

1、向小QWidget中添加按鈕等控件時,隨著添加的按鈕增多,小QWidget自動變大,顯然用QGridLayout來做就能實現這個自動增大這個需求。自動增大也只是出現創(chuàng)建內部容器階段,一旦內部容器和布局、布局內的控件都創(chuàng)建和添加完畢,后續(xù)即使再向布局中添加控件,內部容器也不會自動增大了,這時只有靠setGeometry或者resize手動修改內部容器的大小了。

2、添加完控件后,手動調用一下adjustSize函數,該函數會根據所有子控件的大小之和,來調整父控件的大小。

步驟如下:先在ui中拖入一個QScrollArea控件,名字為scrollArea,然后添加代碼:

MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MainWindow)
{
  ui->setupUi(this);
 
  QGridLayout *pLayout = new QGridLayout();//網格布局
  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的內部QWidget中
}

Qt圖形圖像開發(fā)之QT滾動區(qū)控件QScrollArea怎么用

以上是“Qt圖形圖像開發(fā)之QT滾動區(qū)控件QScrollArea怎么用”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注創(chuàng)新互聯網站建設公司行業(yè)資訊頻道!

另外有需要云服務器可以了解下創(chuàng)新互聯建站bm7419.com,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

名稱欄目:Qt圖形圖像開發(fā)之QT滾動區(qū)控件QScrollArea怎么用-創(chuàng)新互聯
轉載來于:http://bm7419.com/article34/dpdspe.html

成都網站建設公司_創(chuàng)新互聯,為您提供品牌網站建設、電子商務、App設計、靜態(tài)網站、關鍵詞優(yōu)化、動態(tài)網站

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

小程序開發(fā)