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...