Qt的5種經常使用佈局搭建

Qt佈局詳解:php

 

界面開發首先要對整個界面進行佈局,使窗體上的全部的控件必須有一個合適的尺寸和位置。那麼作出來的界面纔看起來美觀。設計模式

那麼如何對界面進行佈局呢?Qt提供了一些類負責排列窗體上的控件,主要有:QHBoxLayout,QVBoxLayout,QGridLayout,QFormLayout,QStackLayout。(佈局管理類)這些類簡單易用,不管在代碼中仍是用Qt Designer開發程序都能用到。app

      經常使用的佈局方法:編輯器

(1)使用水平佈局類QHBoxLayout;ide

(2)使用垂直佈局類QVBoxLayout;函數

(3)使用網格佈局類QGridLayout;工具

(4)使用表格佈局類QFormLayout;佈局

(5)使用分組佈局類QStackLayout(  QStackedLayout類把子控件進行分組或者分頁,一次只顯示一組或者一頁,隱藏其餘組或者頁上的控件)。字體

這些方法能夠嵌套使用。使用這些Qt佈局管理類的另外一個緣由是,在程序、系統改變字體,語言或者在不一樣的平臺上運行時,佈局管理器可以自動調整窗體裏全部控件的大小和尺寸。ui

佈局管理的三種方式:

Qt中有三種方式對窗體上的控件進行佈局管理:

1.絕對位置定位(absolute positioning):控件佈局是固定位置,沒有自適應功能。

例子以下:

QWidget *pWidget = new QWidget;

QLabel label(pWidget);

label.setText(QObject::tr("姓名:"));

label.setGeometry(10,10,20,20);

 QLineEdit namedLineEdit("小王",pWidget);

namedLineEdit.setGeometry(35,10,50,20);

 QPushButton *btn = new QPushButton(QObject::tr("關閉"),pWidget);

     btn->setGeometry(90,10,40,20);

                             

2.手工佈局(manual layout):給出控件的絕對位置,可是他們的尺寸根據窗口的大小肯定,能夠經過重寫窗體控件的resizeEvent()實現對子控件的大小設置。

 

3.佈局管理器(layout managers):運用QHBoxLayout、QVBoxLayout、QGridLayout 、QFormLayout、QStackLayout佈局。

 

(1).Horizontal Layout佈局設置(水平佈局):他包含的對象都橫向排列開,示例如圖3-1所示:

                                         

 

                                             圖 3-1  水平佈局

(2).Vertical Layout佈局設置(垂直佈局):他包含的對象都縱向排列開,示例如圖3-2所示:

                                                      

                                                 圖3-2  豎直佈局

 

(3).Grid Layout佈局設置(網格佈局):將控件放置到網格中佈局,它自己會從父窗口或父佈局中佔據儘量多的界面空間,而後把本身的空間劃分爲行和列,再把每一個控件塞到設置好的一個或多個單元格中。一般狀況下 QGridLayout不須要本身添加空白條 QSpacerItem,由於其餘功能控件把各自的單元格佔據以後,剩下沒控件佔據的單元格天然就是空的,空的格子默認裏面什麼都沒有,也沒有空白條。示例如圖3-3所示:

                               

                                                  圖3-3 網格佈局

(4).Form Layout佈局設置(表格佈局):專門用於管理輸入控件和與之相關的標籤等表單佈局,QFormLayout固定爲兩列布局,並針對表單作了建模,配套了一堆方便使用的函數。網格佈局器的基本單元是單元格,而表單佈局器的基本單元是行。表單佈局器是高度建模並封裝的,它沒有 addWidget()和 addLayout()之類的函數,它只有addRow()函數。表單佈局器中一行的空間能夠由多個控件佔據,也能夠由一個控件佔據。示例如圖3-4所示:

                                        

                                                    圖3-4 表格佈局

(5).佈局管理器在指定的位置留出一塊空間:(Qt Designer中,能夠加入一個spacer實現這一功能)示例如圖3-5所示:

                                   

                                                 圖3-5  佈局留出指定空間

(6).QSpliter分割器的做用:分裂器 QSplitter 是一個實體功能控件,它的基類是 QFrame,QFrame 基類正是 QWidget。QSplitter 能夠獨立存在,能夠做爲父窗口容納多個子控件,分裂器會徹底擁有內部的子控件。在 Qt 設計師或 QtCreator 設計模式左邊 Widget Box 裏面沒有分裂器能夠拖動,使用分裂器的方式是:選中已有的控件,而後點擊上面工具欄的水平分裂器或垂直分裂器按鈕。好比上圖是將三個豐富文本編輯器做爲一個水平分裂器排布 的。分裂器內每一個控件都有一個手柄 Handle,水平分裂器內控件的手柄在左邊,垂直分裂器內控件的手柄在控件上方。第 0 個控件的手柄是永久隱藏的,分裂器自身佔據的大矩形四個邊界線一般不能拖動拉大,只能拖動控件之間的手柄,好比上圖的手柄 1 和 手柄 2 。分裂器總體的尺寸不是用戶控制的,而在分裂器內部的控件尺寸可讓用戶手工拖動手柄來控制。在程序運行時,水平分裂器內各個控件的寬度、垂直分裂器內部各個控件的高度, 通常都是用戶拖動手柄控制,這是分裂器和佈局器最大的不一樣。

具體操做以下圖3-6所示:

                           

                                                               圖  3-6

實際效果以下圖3-7所示:

                                           

                                                     圖 3-7分割實際效果圖

 

 

 

sizepolicy:

1. Fixed: 大小不能改變

2. Minimum: 已是最小, 不能再被縮小, 但能放大.

3. Maximum: 已是最大, 不能再被放大, 但能縮小.

4. Preferred:  控件的sizeHint()是他的sizeHint, 能被縮小, 放大.

5. Expanding: 控件能夠自行增大或者縮小.


 


設置部件大小

只要是繼承自QWidget的類都有如下兩個屬性:

大小提示:siziHint() 保存部件的建議大小信息 ->經過函數可獲取

最小大小提示:minimumSizeHint() 保存部件的建議最小大小信息 ->經過函數可獲取

sizePolicy屬性:

常量 描述
QSizePolicy::Fixed 只能使用sizeHint()提供的值,沒法伸縮
QSizePolicy::Minimum siziHint()提供的大小是最小的,部件能夠被拉伸
QSizePolicy::Maximum sizeHint()提供的是最大大小,部件能夠被壓縮
QSizePolicy::Preferred sizeHint()提供的大小是最佳大小,能夠拉伸能夠壓縮
QSizePolicy::Expanding sizeHint()提供的是合適的大小,部件能夠被壓縮,不過更傾向於拉伸來得到更多的空間
QSizePolicy::MinimumExpanding sizeHint()提供的大小是最小的,部件傾向於被拉伸來獲取更多的空間
QSizePolicy::Ignored sizeHint()的值被忽略,部件將盡量的被拉伸來獲取更多的空間

關於伸縮因子(stretch factor)的概念:在代碼中,能夠在使用佈局管理器的addWidget()函數添加部件時,在第二個參數指定伸縮因子。2,1

 

QLayout

屬性 說明
layoutName 如今所使用的佈局管理器的名稱
layoutLeftMargin 設置佈局管理器到界面左邊界的距離
layoutTopMargin 設置佈局管理器到界面上邊界的距離
layoutRightMargin 右邊界
layoutBottomMargin 下邊界
layoutSpacing 佈局管理器各個子部件間的距離
layoutStretch 伸縮因子
layoutSizeConstraint 設置大小約束條件

QT窗口尺寸,窗口大小和大小改變引發的事件 QResizeEvent。

來源: http://www.qtcn.org/bbs/apps.php?q=diary&a=detail&did=1277&uid=139581

 

 

 


來源:http://blog.csdn.net/dbzhang800/article/details/6741344?reload
操做:


frameGeometry()


幾何尺寸(位置+大小)


對於窗口,包含窗口裝飾器


x()y()pos()


只包含位置信息(左上角座標)


move()


只移動位置


geometry()


幾何尺寸(位置+大小)


不包含窗口裝飾器


width()height()rect()size()


只包含大小信息


setGeometry()


改變位置+大小


resize()


只改變大小



一直在考慮怎麼使中心窗口在主窗口全屏以後,中心窗口也按比例放大。
其中包括,中心窗口的大小適應,中心窗口
1.建立你的UI,其中使用弄好你的頂級佈局,選中widget窗口 - 點擊右鍵 - 佈局 - 柵格佈局。

2.構造函數中





複製代碼

  1.   centralWidget = new QWidget;
       QWidget * a = new QWidget(centralWidget);
       ui1->setupUI(a);
         a->hide();
       QWidget * b = new QWidget(centralWidget);
       ui2->setupUI(b);
         b->hide();
       setCentralWidget(centralWidget) //這樣的好處在於,你能夠弄不少ui,想使用哪一個UI直接uin->setupUI(widgetn),再widgetn->show()就能夠了。








3.可是若是你想拖動主窗口的時候,可以讓窗口中的組件隨着窗口也能縮放的話,須要重寫resizeEvent,緣由在於,在構造以後,子窗口的大小就是固定的。

複製代碼

  1. void resizeEvent(QresizeEvent* size){
        centralWidget->resize(frameGeometry().size()); //是採用size()仍是frameGeometry.size()根據本身的需求。
    }

有什麼問題,請留言說明,你們一塊兒交流而且解決。 附加設備相關的屏幕尺寸信息,若是你重寫resizeEvent的話,我認爲這是沒必要要的。 QDesktopWidget* desktopWidget = QApplication::desktop(); //獲得客戶區矩形 QRect clientRect = desktopWidget->availableGeometry(); //獲得應用程序矩形 QRect applicationRect = desktopWidget->screenGeometry();

相關文章
相關標籤/搜索