topic6:Qt入門之經常使用qt控件認知之QLayout

   瞭解佈局,首先得清楚一個概念,就是容器控件。容器控件就是能夠容納別的控件的一種控件,如QWidget,因此就會出現父類控件與子類控件。爲了很好的管理這種父子類控件,經常使用的有幾種方法:算法

   第一種就是使用絕對位置,setGeometry定位子類控件相對於父類控件。第二種就是常見的佈局。        框架

   佈局管理,其實就是爲容器控件管理子類控件的位置和尺寸,因此佈局自己沒有存在的意義,其須要和容器控件搭配使用,爲容器控件管理子控件服務。ide

   而佈局QLayout類其實只是一組預先撰寫好的代碼,至關於提早寫出了以一個控件存放的規則,依據這種規則,進行對QWidget進行算法處理,在父控件尺寸變化時,根據預設參數和子控件的各類Geometry hint,管理控件的位置和尺寸。因此QLayout所管理的是哪一個父類的QWidget的子控件,則最後將此layout通QWidget::setLaout設置。函數

   佈局被加載到一個容器窗口控件(容器控件)其將負責如下的工做任務:
佈局

   1)放置窗口的子窗口
字體

   2)獲取窗口部件的默認尺寸及最小尺寸
spa

   3)從新校訂窗口尺寸處理
代理

   4)自動更新當內容改變時,好比字體大小,文本或者子窗口內容改變,或者顯示或隱藏控件,刪除子控件等狀況。
orm

   使用佈局管理控件,其加載目的是爲了更好的調整各個控件所佔用的空間,達到更好的顯示效果。因此其須要對各個空間如何動態調整其尺寸策略。這就致使被管理控件的尺寸規則與佈局放置控件佔用的空間尺寸規則有些重圖,那麼須要一個規則去解決,固然首先須要肯定如何將QWidget添加到QLayout,而後尺寸規則處理以下:對象

   1)依據QWidget的sizePolicy()及QWidget::sizeHint()首先申請以一塊空間

   2)若是任何一個QWidget設置了拉昇係數stretch factors,且其值大於0,則其按照此拉昇係數申請一塊空間。

   3)若是widget的拉昇系統被設置爲0,若是其餘控件不須要空間,則其能夠獲取更多的空間,。這樣,QWidget能夠擴充控件依據尺寸策略

   4)若是控件申請的空間比這個QWidget控件的minimum尺寸(或者hint計算出來的大小)還小則申請這個空間尺寸爲minimum

   5)任何一個控件申請的空間大於控件最大尺寸maxmum,則設定爲控件最大值maxmun做爲尺寸

   拉昇係數(因子)stretch factors是用來改變各個各個控件的空間尺寸比例。默認widgets是建立一個沒有拉昇系統的控件

 
 

   注:由於QWidget類自己並非一個QLayoutItem,而Qlayout的管理又是以QLayoutItem爲單位。因此,在addWidget的操做中,QLayout還會建立一個QLayoutItem的子類QWidgetItem類來對應的包裝代理添加進來的子控件。QWidgetItem對象最終會將QLayout佈局管理體系中的佈局參數信息裝換、設置到它所代理的QWidget對象上。

   Qt提供了常見的以QLayout爲基類的佈局類,即QBoxLayout,QGridLayout,QFormLayout及QStackedLayout。

   一、QLayout:是全部佈局類的基類,是個抽象類,用戶能夠根據本身的佈局規則實現佈局類。由於佈局類就比如一個管理控件的框架,對所要填制控件的位置都進行了規定和標記,制定好規矩,而後根據此規矩和要求添加相對應的控件。好比QBoxLayout須要制定順序,是左右,上下的等等

   若是須要實現本身的佈局模板,須要實現addItem函數,sizeHint()函數,setGeometry(),ienmA函數及takeAt和tItemAt等函數,此些函數都是根據規則肯定控件存放的空間的pos位置信息並以此計算尺寸的信息。固然能夠實現minimumSize()以保證當空間很是小的時候layout不會重設定大小爲0。爲了支持子子類其高度決定其寬度,須要實現hasHeightForWidth和heightForWidth函數。

   最重要的枚舉定義enum QLayout::SizeConstraint尺寸策略,其會對安裝了此layout的主容器窗口進行大小的調整,以保證恰到好處,由於layout基本保持與主窗口空間填充滿。

   1)QLayout::seetDefaultConstraint  0:主窗口最小值被設置爲minimumSize(),即layout管理所需的最小空間尺寸,除非空間widget已經有最小的minimumSize尺寸。

   2)QLayout::SetFixedSize 3,主窗口的大小被設定爲sizeHint()恰好適配好的大小,並不能再被從新設定大小。

   3)QLayout::SetMinimumSize 2,設定主窗口minimumSize爲minimumSize()定義的,其不能再小

   4)QLayout::SetMaxmumSize 4,設定主窗口的最大尺寸maxmumSize到maxmumSize()函數肯定的尺寸,其不能大於這個尺寸。

   5)QLayout::SetMinAndMaxSize 5,設定主窗口的大小尺寸分別爲minimumSize和maxmunSize

   6)QLayout::setNoConstraint 1,主窗口不設定尺寸策略,保持用戶設定的已有屬性


   1.1 Layout屬性

   1)sizeConstraint : SizeConstraint  此屬性保存佈局重置大小的方式

   SizeConstraint sizeConstraint()訪問其值,setSizeConstraint(SizeConstraint)設置

   2)spacing:int 保存在佈局裏面兩個widget空間之間的間隔。若是沒有設置則其繼承父layout佈局的大小,或者設置父窗口的樣式屬性內。

   在QGridLayout和QFormLayout,可使用setHorizontalSpacing()和setVerticalSpacing(),這樣的話spacing則返回-1。使用spacing進行獲取,setSpaicing(int val)進行設置

   1.2 QLayout常見接口

   1)addItem(QLayoutItem *item)純虛函數,其實現子類必須實現。因此如何添加依賴於具體的實現法則。一般加一個窗口不見widget到佈局layout時使用addWidget接口,添加一個子佈局使用addLayout接口。此接口不經常使用,其使用原理是將addWidget的widget和addLayout的layout會添加到此變量上去。

   2)addWidget(QWidget *w)將這個窗口部件添加到指定的佈局上,其使用addItem

   3)QSize closestAcceptableSize ( const QWidget * widget, const QSize &size ) [static]

   返回知足全部限制策略的大小尺寸給widget,包括heightForWidth(),而且儘量接近size大小。

   4)QMargins contentsMargins()返回佈局周邊的邊距。絕大多數邊距使用11像素到各個方向

   void QLayout::setContentsMargins ( int left, int top, int right, int bottom )

   void QLayout::setContentsMargins ( const QMargins & margins )

   設置不一樣方向的邊距。

   5)QRect QLayout::contentsRect ()返回佈局的矩形大小,但須要考慮內容邊界。

   6)int count()純虛函數,實現佈局實習那,表示此佈局的item數量

   7)Qt::Orientations QLayout::expandingDirections () const [virtual]

   返回layout擴展的方向,通常是Qt::Vertical或者Qt::Horizontal表示只想一個方向grow,不然是兩個方向。

   8)QRect QLayout::geometry () const [virtual]

   返回此佈局佔用的幾何空間,矩形顯示,其他contentRect不一樣setGeometry設置尺寸

   9)int QLayout::indexOf ( QWidget * widget ) const [virtual]

   返回佈局空間的索引序號,同count使用同樣,layout使用index爲了便於管理其應的控件。-1表示沒有找到。默認的實現方法是使用itemAt查詢,但其不會搜索子佈局。.

   10)bool QLayout::isEmpty () const [virtual]判斷佈局下空間是否爲空

   11)isEnable()若是爲true,layout是激活的enabled,使用setEnabled進行設置。

   12)QLayoutItem * QLayout::itemAt ( int index ) const [pure virtual]

   純虛函數,須要具體子類進行實現,若是index位置沒有控件,則返回0。items是進行編號的,若是某個控件刪除了,則從新編號

   13)layout()若是其控件是個佈局,則返回佈局,不然返回0

   14)QSize QLayout::maximumSize () const [virtual]返回佈局的最大值,是佈局擴展的最大值

   15) QSize QLayout::minimumSize () const [virtual]返回模具的最小值,是佈局可被壓縮最小值

   16)QWidget parentWidget():返回主窗口控件的佈局,若是這個佈局沒有安裝到任何窗口上,則返回0。若是此佈局是一個子佈局,則其返回父類佈局的父類窗口部件。

   17)void removeItem(QLayoutItem *item)刪除一個佈局的控件。釋放delete 這個選項是用戶調的責任

   18)void remobeWidget(QWidget *w)從一個佈局刪除一個控件。這是調用者則取去保證widget一個可給出可用的控件或者又放回佈局

   19)bool setAlignment(QWidget * w,Qt::Alignment alignment)設置窗口部件w對齊模式,若是w在佈局中找到(不包含子類佈局)窗口w,則返回true,不然返回false

   20)void setAlignment(Qt::Alignmen alignment)設置當前佈局的對其模式。

   bool setAlignment(QLayout *k,Qt::Alignment)設置一個對其方式給佈局了,若是被拒找到了,再也不子佈局中找,則返回true,不然返回false。

   21)void setMenuBar(QWidget *w)告訴尺寸管理者將菜單條放置到界面到parentWidget父窗口的最上層。其最全部的控件都防止到按鈕邊緣下面。

   22)voud update()更新父控件的佈局。

   23)QLayoutItem takeAt(int index) 純虛函數,子類實現必須實現的函數,此目的是刪除佈局index所指的選項,並返回該選項。若是沒有選項,則其什麼都不作而且返回0.


   總之,QLayout做爲全部實現類的基類,其包含sizeConstraint屬性及spacing屬性保證佈局控件如何限制約束及佈局內項目之間的距離。佈局是能夠嵌套的,經過setAlignment設置函數設置子類widget對其方式,以及設置獲取佈局的幾何尺寸geometry,設置獲取內容的邊距contengsMargin。佈局須要添加和刪除控件,一塊兒經過index查找指定的控件並做操做等。

相關文章
相關標籤/搜索