日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【Qt】Qt布局管理器

發(fā)布時(shí)間:2024/4/24 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Qt】Qt布局管理器 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

00. 目錄

文章目錄

    • 00. 目錄
    • 01. 概述
    • 02. 布局相關(guān)類(lèi)
    • 03. 布局圖示
    • 04. 為布局添加控件
    • 05. 伸展因素
    • 06. 布局中自定義控件
    • 07. 手動(dòng)布局
    • 08. 附錄

01. 概述

Qt的布局系統(tǒng)提供了一個(gè)簡(jiǎn)單的和強(qiáng)有力的方式,來(lái)自動(dòng)排列窗口子控件布局。

所有QWidget子類(lèi)可以使用布局來(lái)管理他們的子控件。QWidget::setLayout()函數(shù)可以為一個(gè)控件布局。當(dāng)通過(guò)這種方式布局以后,它負(fù)責(zé)以下任務(wù):

  • 布置子控件。
  • 最高層窗口可感知的默認(rèn)大小。
  • 最高層窗口可感知的最小大小。
  • 調(diào)整大小的處理。
  • 當(dāng)內(nèi)容改變的時(shí)候自動(dòng)更新:
    • 字體大小、文本或者子控件的其它內(nèi)容。
    • 隱藏或者顯示子控件。
    • 移除一些子控件。

類(lèi)之間的繼承關(guān)系

02. 布局相關(guān)類(lèi)

Qt的布局類(lèi)使用手寫(xiě)的C++代碼設(shè)計(jì)的,所以很容易理解和使用。

使用Qt Designer創(chuàng)建的界面生成的代碼也使用了布局類(lèi)。

03. 布局圖示

為窗口提供一個(gè)好布局的最佳方式是使用內(nèi)置的布局管理器:QHBoxLayout、QVBoxLayout、QGridLayout和QFormLayout。這些類(lèi)都派生自QLayout,QLayout又派生自QObject和QLayoutItem(非QWidget),布局窗口自動(dòng)地把子窗口按照它們被構(gòu)造地順序進(jìn)行布局。要生成更復(fù)雜的布局,可以在其它布局里面嵌入另一個(gè)布局。

QHBoxLayout

把子窗口從左到右排列在一個(gè)水平行上。

QVBoxLayout

把子窗口從上到下排列在一個(gè)垂直列上。

QGridLayout

把子窗口排列在一個(gè)二維的網(wǎng)格中,窗口可占據(jù)多個(gè)單元格。

QFormLayout

把子窗口按照標(biāo)簽-輸入框的形式排列在兩列。

使用布局提示

當(dāng)使用布局的時(shí)候,構(gòu)建子控件的時(shí)候不需要指定parent,布局將會(huì)自動(dòng)的指定parent(使用QWidget::setParent()),使它們成為安裝了該布局的界面的子控件。

【注意】

布局中的控件是安裝了該布局的界面的子控件,而非布局自身的,控件只能以控件作為parent,不能是布局。也可以在布局中使用addLayout()來(lái)添加布局,內(nèi)部的布局就會(huì)變成它的子布局。

04. 為布局添加控件

當(dāng)添加一個(gè)控件到一個(gè)布局中,布局過(guò)程工作如下:

  • 所有的控件將最初根據(jù)它們的 QWidget::sizePolicy()和QWidget::sizeHint()而被分配到一定空間中。

  • 如果任何一個(gè)控件有一個(gè)伸展因素設(shè)置,而且數(shù)值大于零,那么它們就會(huì)被根據(jù)它們的伸展因素的比例分配空間。

  • 如果任何一個(gè)控件有一個(gè)伸展因素設(shè)置而且數(shù)值為零,那么只有當(dāng)其它控件不再需要空間的時(shí)候才會(huì)得到更多的空間。在這當(dāng)中,空間會(huì)首先被根據(jù)延展大小策略分配給控件。

  • 任何控件被分配的空間的大小如果小于它們的最小大小(或者是在沒(méi)有規(guī)定最小大小時(shí)的最小大小的提示),它們就會(huì)被按它們所需要的最小大小分配空間。(如果控件的伸展因素是它們的決定因素的情況下,它們不必有最小大小或者最小大小的提示。)

  • 任何控件被分配的空間的大小如果大于它們的最大大小,它們就會(huì)被按它們所需要的最大大小分配空間。(如果控件的伸展因素是它們的決定因素的情況下,它們不必有最大大小。)

05. 伸展因素

控件通常是在沒(méi)有伸展因素設(shè)置的情況下被生成的。當(dāng)它們被布置到一個(gè)布局中時(shí),控件會(huì)被根據(jù)它們的QWidget::sizePolicy()或者它們的最小大小的提示中大的那一個(gè)分配給整個(gè)空間的一部分。伸展因素是用來(lái)根據(jù)控件互相的比例來(lái)改變它們所被分配的空間。

如果你使用一個(gè)QHBoxLayout來(lái)布置沒(méi)有伸展參數(shù)設(shè)置的三個(gè)控件,我們就會(huì)得到像下面這樣的布局:

如果我們給每個(gè)控件設(shè)置一個(gè)伸展因素,它們就會(huì)被按比例布置(但是不能小于最小大小的提示),舉例來(lái)說(shuō):

06. 布局中自定義控件

當(dāng)你創(chuàng)建自己的控件類(lèi)時(shí),也應(yīng)該傳遞它的布局屬性。如果這個(gè)控件有一個(gè)QLayout,這樣的話就已經(jīng)被處理了。如果這個(gè)控件不包括任何子控件,或者使用自定義布局,需要重新實(shí)現(xiàn)下面這些QWidget的成員函數(shù):

QWidget::sizeHint() 返回控件的優(yōu)先選用的大小。
QWidget::minimumSizeHint() 返回控件所能有的最小大小。
QWidget::setSizePolicy() 指定控件所需要的空間。
只要大小提示、最小大小提示或者大小策略發(fā)生改變,都要調(diào)用QWidget::updateGeometry()。這會(huì)引起布局的重新計(jì)算。對(duì)updateGeometry()的多重調(diào)用只會(huì)引起一次重新計(jì)算。

如果你的控件的優(yōu)先選用的高度依賴(lài)于它的實(shí)際寬度(比如一個(gè)自動(dòng)斷詞的標(biāo)簽),在sizePolicy()中設(shè)置hasHeightForWidth()標(biāo)記,并且重新實(shí)現(xiàn)QWidget::heightForWidth()。

即使你實(shí)現(xiàn)了heightForWidth(),提供一個(gè)好的sizeHint()仍然是必需的。

詳細(xì)描述請(qǐng)參考:Trading Height for Width.。

07. 手動(dòng)布局

如果要生成一種特殊的布局,也可以按上面的描述來(lái)生成一個(gè)自定義控件。重新實(shí)現(xiàn)QWidget::resizeEvent()來(lái)計(jì)算所需要分配的大小并且給每一個(gè)子控件調(diào)用setGeometry()。

當(dāng)布局需要重新計(jì)算的時(shí)候,控件會(huì)得到一個(gè)類(lèi)型是QEvent::LayoutRequest的事件。重新實(shí)現(xiàn)被通知QEvent::LayoutRequest事件的QWidget::event()。

08. 附錄

8.1 Qt教程匯總
網(wǎng)址:https://dengjin.blog.csdn.net/article/details/115174639

8.2 關(guān)鍵詞
關(guān)鍵詞:Layout Management

總結(jié)

以上是生活随笔為你收集整理的【Qt】Qt布局管理器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。