QT布局管理
QT的布局管理系統提供簡單而強大的機制自動排列一個窗口中的部件、所有QWidget類子類的實例都可以使用布局管理器來管理位於其中的子部件,QWidget::setLayouyt()
函數可以在一個部件上應用布局管理器。一個部件應用布局管理器后會完成以下任務:
-
定位子部件
-
感知窗口默認大小
-
感知窗口最大最小
-
改變大小處理
-
當內容改變時自動更新
- 字體大小,文本或子部件的其他內容隨之改變
- 隱藏或顯示子部件
- 移除一個子部件
QLayout
屬性 | 說明 |
---|---|
layoutName | 現在所使用的布局管理器的名稱 |
layoutLeftMargin | 設置布局管理器到界面左邊界的距離 |
layoutTopMargin | 設置布局管理器到界面上邊界的距離 |
layoutRightMargin | 右邊界 |
layoutBottomMargin | 下邊界 |
layoutSpacing | 布局管理器各個子部件間的距離 |
layoutStretch | 伸縮因子 |
layoutSizeConstraint | 設置大小約束條件 |
QBoxLayout、基本布局管理器
基本布局管理器使子布局在水平方向或垂直方向排成一列,將所有空間分成一行盒子,然后將每個部件放入一個盒子中。
QHBoxLayout、水平布局管理器
QVBoxLayout、垂直布局管理器
QGridLayout、柵格布局管理器
柵格布局管理器將空間分隔成行和列,行和列的交叉處形成單元格,然后將部件放入確定的單元格中。
#include <QGridLayout>
QGridLayout * layout = new QGridLayout;
layout->addWidget(Btn, 0, 0, 1, 2);
//添加部件,從第1行第1列開始,占據1行2列
QPushButton *pButton = new QPushButton(this);
QLabel *pFirstPage= new QLabel(this);
QLabel *pSecondPage = new QLabel(this);
QLabel *pThirdPage = new QLabel(this);
m_pStackedLayout = new QStackedLayout();
pButton->setText(QStringLiteral("點擊切換"));
pFirstPage->setText(QStringLiteral("一去丶二三里"));
pSecondPage->setText(QStringLiteral("青春不老,奮斗不止!"));
pThirdPage->setText(QStringLiteral("純正開源之美,有趣、好玩、靠譜。。。"));
// 添加頁面(用於切換)
m_pStackedLayout->addWidget(pFirstPage);
m_pStackedLayout->addWidget(pSecondPage);
m_pStackedLayout->addWidget(pThirdPage);
QVBoxLayout *pLayout = new QVBoxLayout();
pLayout->addWidget(pButton, 0, Qt::AlignLeft | Qt::AlignVCenter);
pLayout->addLayout(m_pStackedLayout);
pLayout->setSpacing(10);
pLayout->setContentsMargins(10, 10, 10, 10);
setLayout(pLayout);
// 連接切換按鈕信號與槽
connect(pButton, &QPushButton::clicked, this, &MainWindow::switchPage);
// 切換頁面
void MainWindow::switchPage()
{
int nCount = m_pStackedLayout->count();
int nIndex = m_pStackedLayout->currentIndex();
// 獲取下一個需要顯示的頁面索引
++nIndex;
// 當需要顯示的頁面索引大於等於總頁面時,切換至首頁
if (nIndex >= nCount)
nIndex = 0;
m_pStackedLayout->setCurrentIndex(nIndex);
}
QFormLayout、表單布局管理器
用來管理表格的輸入部件及相關的標簽,將它的子部件分為兩列,左邊是一些標簽,右邊是一些輸入部件。
參考addRow()
QStackedLayout、棧布局管理器
addLayout()
將一個子布局管理器放入主布局。
設置部件大小
只要是繼承自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
約束頂層窗口大小、LayoutSizeConstraint
5個常量,類似於sizePolicy屬性,在文檔中查詢使用。建議QLayout::SetNoConstraint 部件不被約束
可擴展窗口
一個窗口可能很多選項是擴充的,只在必要的時候顯示出來,這是就可以使用一個按鈕,用來隱藏或顯示多余的內容。要實現可擴展窗口,就得使用布局管理的特征,當子部件隱藏時,布局管理器自動縮小,當子部件重新顯示時,布局管理器再次放大。
void MyWidget::on_pushButton_toggled(bool checked)
{
ui -> textEdit -> setVisible(checked); //按完按鈕顯示
}
ui -> textEdit -> hide(); //隱藏