最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt圖形圖像開發(fā)之QT滾動(dòng)區(qū)控件(滾動(dòng)條)QScrollArea的詳細(xì)方法用法圖解與實(shí)例

 更新時(shí)間:2020年03月12日 09:03:59   作者:qq_610642  
這篇文章主要介紹了Qt圖形圖像開發(fā),QT滾動(dòng)區(qū)控件(滾動(dòng)條)QScrollArea的詳細(xì)方法用法圖解與實(shí)例,需要的朋友可以參考下

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

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

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

對于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,也就是說,QScrollArea這個(gè)容器本身就套了兩層,我們放入的按鈕等控件,都處在scrllAreaWidgetContents層,下文中我把QScrollArea.widget統(tǒng)一稱之為“內(nèi)部容器”或者"內(nèi)容層",內(nèi)部容器是QScrollArea這個(gè)控件的子控件。

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

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

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

一旦理解了幕布和觀察窗口的關(guān)系,就能很容易的總結(jié)出QScrollArea的標(biāo)準(zhǔn)編程步驟,分這么幾種情況:

QScrollArea純代碼實(shí)現(xià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)備完畢之后,否則顯示有問題
  scrollArea->setWidget(pWgt);
  setCentralWidget(scrollArea);
}
 
MainWindow::~MainWindow()
{
  delete ui;
}

QScrollArea是直接從ui里拖出來

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

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

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

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

 

一句話總結(jié)QScrollArea何時(shí)出現(xiàn)滾動(dòng)條

只要幕布控件scorllAreaWidgetContents的大小超過了QScrollArea的大小,就會(huì)自動(dòng)出現(xiàn)滾動(dòng)條;如果幕布比觀察窗口還小,那就不會(huì)出現(xiàn)滾動(dòng)條。

最后再看幾個(gè)實(shí)例

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

我們運(yùn)行一下程序,然后把窗口縮小,看看是不是當(dāng)窗口<scorllAreaWidgetContents最小值500*1000時(shí),會(huì)自動(dòng)出現(xiàn)水平滾動(dòng)條。看下圖發(fā)現(xiàn),并沒有出現(xiàn)我們期望的效果。

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

使得QScrollArea的大小受窗體大小驅(qū)動(dòng)。運(yùn)行起來,再看下效果:

再補(bǔ)充幾點(diǎn):

內(nèi)部的小QWidget與QScrollArea的關(guān)系,就像是給QScrollArea設(shè)置了網(wǎng)格布局,然后把小QWidget放進(jìn)了這個(gè)布局中,如果給小QWidget設(shè)置的最大寬高<QScrollArea的實(shí)時(shí)大小,那么QScrollArea會(huì)顯示出空白,而空白部分是無法放置/顯示我們自己拖入的控件的,如下圖:

技巧:

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

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

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

1、向小QWidget中添加按鈕等控件時(shí),隨著添加的按鈕增多,小QWidget自動(dòng)變大,顯然用QGridLayout來做就能實(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ù)所有子控件的大小之和,來調(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滾動(dòng)區(qū)控件(滾動(dòng)條)QScrollArea的詳細(xì)方法用法圖解與實(shí)例,更多關(guān)于QT圖形圖像開發(fā)知識(shí)請查看下面的相關(guān)鏈接

相關(guān)文章

  • C/C++常用函數(shù)易錯(cuò)點(diǎn)分析

    C/C++常用函數(shù)易錯(cuò)點(diǎn)分析

    這篇文章主要介紹了C/C++常用函數(shù)易錯(cuò)點(diǎn)分析,包含了memset、sizeof、getchar三個(gè)常用函數(shù)的分析,需要的朋友可以參考下
    2014-08-08
  • C++ vector數(shù)組用法及解析

    C++ vector數(shù)組用法及解析

    這篇文章主要給大家分享的是C++ vector數(shù)組用法及解析,什么是什么是vector數(shù)組呢?下面文章將對打家做詳細(xì)介紹,感興趣的小伙伴可以參考一下
    2021-10-10
  • OpenCV實(shí)現(xiàn)摳圖工具

    OpenCV實(shí)現(xiàn)摳圖工具

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)摳圖工具,文中示例代碼介紹的非常詳細(xì),具有一定為大家詳細(xì)的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語言漢諾塔的簡單了解

    C語言漢諾塔的簡單了解

    這篇文章主要給大家介紹了關(guān)于C語言漢諾塔的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • C++類中的常數(shù)據(jù)成員與靜態(tài)數(shù)據(jù)成員之間的區(qū)別

    C++類中的常數(shù)據(jù)成員與靜態(tài)數(shù)據(jù)成員之間的區(qū)別

    常數(shù)據(jù)成員是指在類中定義的不能修改其值的一些數(shù)據(jù)成員,類似于我們以前學(xué)過的常變量,雖然是變量,也有自己的地址,但是一經(jīng)賦初值,便不能再被修改
    2013-10-10
  • C語言?typedef的用法示例詳解

    C語言?typedef的用法示例詳解

    typedef是在C和C++編程語言中的一個(gè)關(guān)鍵字,作用是為現(xiàn)有的數(shù)據(jù)類型(int、float、char……)創(chuàng)建一個(gè)新的名字,目的是為了使代碼方便閱讀和理解,這篇文章主要介紹了C語言typedef的使用,需要的朋友可以參考下
    2023-06-06
  • C語言中的常見進(jìn)制轉(zhuǎn)換詳解(從二進(jìn)制到十六進(jìn)制)

    C語言中的常見進(jìn)制轉(zhuǎn)換詳解(從二進(jìn)制到十六進(jìn)制)

    進(jìn)制轉(zhuǎn)換是計(jì)算機(jī)編程中的一個(gè)常見任務(wù),特別是在處理低級別的數(shù)據(jù)操作時(shí),C語言作為一門底層編程語言,在進(jìn)制轉(zhuǎn)換方面提供了靈活的操作方式,今天,我們將深入探討C語言中的進(jìn)制轉(zhuǎn)換,了解如何在二進(jìn)制、八進(jìn)制、十進(jìn)制和十六進(jìn)制之間相互轉(zhuǎn)換,需要的朋友可以參考下
    2025-05-05
  • C++實(shí)現(xiàn)停車場管理系統(tǒng)

    C++實(shí)現(xiàn)停車場管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)停車場管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++ vector刪除符合條件的元素示例分享

    C++ vector刪除符合條件的元素示例分享

    這篇文章主要介紹了C++ vector刪除符合條件的元素示例,需要的朋友可以參考下
    2014-02-02
  • MATLAB全網(wǎng)最全的colormap的使用教程詳解

    MATLAB全網(wǎng)最全的colormap的使用教程詳解

    眾所周知,MATLAB中的colormap只有少得可憐的幾種,有很多應(yīng)用在很特殊的圖形中的colormap幾乎都沒有,而每次寫代碼都要去找顏色的圖屬實(shí)太麻煩。所以本文將包全部集成了進(jìn)來,終于有了這套包含200個(gè)colormap的工具函數(shù),希望對大家有所幫助
    2023-02-02

最新評論

中方县| 武冈市| 高尔夫| 秦皇岛市| 苏尼特左旗| 许昌市| 安乡县| 河曲县| 都江堰市| 元朗区| 内乡县| 江川县| 崇仁县| 富宁县| 台安县| 浙江省| 阳东县| 晋宁县| 林芝县| 灵山县| 贺州市| 桃江县| 余干县| 塘沽区| 玛纳斯县| 常德市| 土默特右旗| 仁寿县| 安阳市| 肇州县| 兴安盟| 工布江达县| 杭州市| 保靖县| 静乐县| 苍梧县| 瑞昌市| 阿克苏市| 双桥区| 盈江县| 安平县|