Qt 之格柵布局(QGridLayout)

2021-08-21 15:07:26 字數 4203 閱讀 1671

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

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

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

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

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

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

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

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

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

// 構建控制項 頭像、使用者名稱、密碼輸入框等

qlabel *

pimagelabel =

newqlabel(this);

qlineedit *

puserlineedit =

newqlineedit(this);

qlineedit *

ppasswordlineedit =

newqlineedit(this);

qcheckbox *

premembercheckbox =

newqcheckbox(this);

qcheckbox *

pautologincheckbox =

newqcheckbox(this);

qpushbutton *

ploginbutton =

newqpushbutton(this);

qpushbutton *

pregisterbutton =

newqpushbutton(this);

qpushbutton *

pforgotbutton =

newqpushbutton(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 =

newqgridlayout();

// 頭像 第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);

這個單元將從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類似,這個是新增布局。

和qboxlayout的addstretch功能類似。

setspacing()可以同時設定水平、垂直間距,設定之後,水平、垂直間距相同。

sethorizontalspacing()、setverticalspacing()可以分別設定水平間距、垂直間距。

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

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

Qt布局管理器之網格布局 QGridLayout

qt網格布局和水平 垂直布局類似,qgridlayout將控制項布局在網格中。qgridlayout和qhboxlayout類似,可以插入widget 插入子layout 設定拉伸係數等,不同的是qgridlayout多了乙個行 列的概念。在插入widget 插入子layout 設定拉伸係數時都需要...

響應式網格(柵格化)布局

1 查詢 media min width 769px 2calc計算 注意 可以將 px混合使用。cale 裡可以是表示式。但有一點注意。號的前後必須留有空格。否則識別不了,屬性不會生效。calc 8.333 20px 這裡將子元素設為border box。指的是總共的寬度,包括左右留下的margi...

Qt之表單布局(QFormLayout)

qformlayout管理輸入型控制項和關聯的標籤組成的那些form表單。qformlayout是乙個方便的布局類,其中的控制項以兩列的形式被布局在表單中。左列包括標籤,右列包含輸入控制項,例如 qlineedit qspinbox等。我們可以通過addrow const qstring label...