QT布局管理


QT布局管理

QT的布局管理系統提供簡單而強大的機制自動排列一個窗口中的部件、所有QWidget類子類的實例都可以使用布局管理器來管理位於其中的子部件,QWidget::setLayouyt()函數可以在一個部件上應用布局管理器。一個部件應用布局管理器后會完成以下任務:

  1. 定位子部件

  2. 感知窗口默認大小

  3. 感知窗口最大最小

  4. 改變大小處理

  5. 當內容改變時自動更新

    1. 字體大小,文本或子部件的其他內容隨之改變
    2. 隱藏或顯示子部件
    3. 移除一個子部件

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(); //隱藏


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM