1. 程式人生 > >Qt 之格柵佈局(QGridLayout)

Qt 之格柵佈局(QGridLayout)

簡述

QGridLayout:格柵佈局,也被稱作網格佈局(多行多列)。

柵格佈局將位於其中的視窗部件放入一個網狀的柵格之中。QGridLayout需要將提供給它的空間劃分成的行和列,並把每個視窗部件插入並管理到正確的單元格。 柵格佈局是這樣工作的:

它計算了位於其中的空間,然後將它們合理的劃分成若干個行(row)和列(column),並把每個由它管理的視窗部件放置在合適的單元之中,這裡所指的單元(cell)即是指由行和列交叉所劃分出來的空間。

在柵格佈局中,行和列本質上是相同的,只是叫法不同而已。下面將重點討論列,這些內容當然也適用於行。

在柵格佈局中,每個列(以及行)都有一個最小寬度(使用setColumnMinimumWidth()設定)以及一個伸縮因子(使用setColumnStretch()設定)。最小寬度指的是位於該列中的視窗部件的最小的寬度,而伸縮因子決定了該列內的視窗部件能夠獲得多少空間。

|

詳細描述

一般情況下我們都是把某個視窗部件放進柵格佈局的一個單元中,但視窗部件有時也可能會需要佔用多個單元。這時就需要用到addWidget()方法的一個過載版本,原型如下:

  • void addWidget(QWidget *, int row, int column, int rowSpan, int columnSpan, Qt::Alignment = 0);

這個單元將從row和column開始,擴充套件到rowSpan和columnSpan指定的倍數的行和列。如果rowSpan或columnSpan的值為-1,則視窗部件將擴充套件到佈局的底部或者右邊邊緣處。

在建立柵格佈局完成後,就可以使用addWidget(),addItem(),以及addLayout()方法向其中加入視窗部件,以及其它的佈局。

使用

下面我們以企鵝為例,來講解如何使用QGridLayout。

效果

這裡寫圖片描述

原始碼

// 構建控制元件 頭像、使用者名稱、密碼輸入框等
QLabel *pImageLabel = new QLabel(this);
QLineEdit *pUserLineEdit = new QLineEdit(this);
QLineEdit *pPasswordLineEdit = new QLineEdit(this);
QCheckBox *pRememberCheckBox = new QCheckBox(this);
QCheckBox *pAutoLoginCheckBox =
new QCheckBox(this); QPushButton *pLoginButton = new QPushButton(this); QPushButton *pRegisterButton = new QPushButton(this); QPushButton *pForgotButton = new QPushButton(this); pLoginButton->setFixedHeight(30); pUserLineEdit->setFixedWidth(200); // 設定頭像 QPixmap pixmap(":/Images/logo"); pImageLabel->setFixedSize(90, 90); pImageLabel->setPixmap(pixmap); pImageLabel->setScaledContents(true); // 設定文字 pUserLineEdit->setPlaceholderText(QStringLiteral("QQ號碼/手機/郵箱")); pPasswordLineEdit->setPlaceholderText(QStringLiteral("密碼")); pPasswordLineEdit->setEchoMode(QLineEdit::Password); pRememberCheckBox->setText(QStringLiteral("記住密碼")); pAutoLoginCheckBox->setText(QStringLiteral("自動登入")); pLoginButton->setText(QStringLiteral("登入")); pRegisterButton->setText(QStringLiteral("註冊賬號")); pForgotButton->setText(QStringLiteral("找回密碼")); QGridLayout *pLayout = new QGridLayout(); // 頭像 第0行,第0列開始,佔3行1列 pLayout->addWidget(pImageLabel, 0, 0, 3, 1); // 使用者名稱輸入框 第0行,第1列開始,佔1行2列 pLayout->addWidget(pUserLineEdit, 0, 1, 1, 2); pLayout->addWidget(pRegisterButton, 0, 4); // 密碼輸入框 第1行,第1列開始,佔1行2列 pLayout->addWidget(pPasswordLineEdit, 1, 1, 1, 2); pLayout->addWidget(pForgotButton, 1, 4); // 記住密碼 第2行,第1列開始,佔1行1列 水平居左 垂直居中 pLayout->addWidget(pRememberCheckBox, 2, 1, 1, 1, Qt::AlignLeft | Qt::AlignVCenter); // 自動登入 第2行,第2列開始,佔1行1列 水平居右 垂直居中 pLayout->addWidget(pAutoLoginCheckBox, 2, 2, 1, 1, Qt::AlignRight | Qt::AlignVCenter); // 登入按鈕 第3行,第1列開始,佔1行2列 pLayout->addWidget(pLoginButton, 3, 1, 1, 2); // 設定水平間距 pLayout->setHorizontalSpacing(10); // 設定垂直間距 pLayout->setVerticalSpacing(10); // 設定外間距 pLayout->setContentsMargins(10, 10, 10, 10); setLayout(pLayout);

常用介面

  • addWidget(QWidget *, int row, int column, Qt::Alignment = 0)
  • addWidget(QWidget *, int row, int column, int rowSpan, int columnSpan, Qt::Alignment = 0)
    新增視窗部件至佈局。

這個單元將從row和column開始,擴充套件到rowSpan和columnSpan指定的倍數的行和列。如果rowSpan或columnSpan的值為-1,則視窗部件將擴充套件到佈局的底部或者右邊邊緣處,Qt::Alignment為對齊方式。

-addLayout(QLayout *, int row, int column, Qt::Alignment = 0)
-addLayout(QLayout *, int row, int column, int rowSpan, int columnSpan, Qt::Alignment = 0)

和addWidget類似,這個是添加布局。

  • setRowStretch(int row, int stretch)
  • setColumnStretch(int column, int stretch)
    設定行/列的伸縮空間

和QBoxLayout的addStretch功能類似。

  • setSpacing(int spacing)
  • setHorizontalSpacing(int spacing)
  • setVerticalSpacing(int spacing)
    設定間距

setSpacing()可以同時設定水平、垂直間距,設定之後,水平、垂直間距相同。
setHorizontalSpacing()、setVerticalSpacing()可以分別設定水平間距、垂直間距。

  • setRowMinimumHeight(int row, int minSize)
    設定行最小高度

  • setColumnMinimumWidth(int column, int minSize)
    設定列最小寬度

  • columnCount()
    獲取列數

  • rowCount()
    獲取行數

  • setOriginCorner(Qt::Corner)
    設定原始方向

    和QBoxLayout的setDirection功能類似。

總結

當介面元素較為複雜時,應毫不猶豫的儘量使用柵格佈局,而不是使用水平和垂直佈局的組合或者巢狀的形式,因為在多數情況下,後者往往會使“局勢”更加複雜而難以控制。柵格佈局賦予了介面設計器更大的自由度來排列組合介面元素,而僅僅帶來了微小的複雜度開銷。

當要設計的介面是一種類似於兩列和若干行組成的形式時,使用表單佈局要比柵格佈局更為方便些。