Qt的UI佈局以及控制元件間隔(Spacing)邊距(Margins)
替一個Widget設定佈局有兩種方法。
1layout 建構函式傳遞QWidget
QVBoxLayout* MainQVboxLayout=new QVBoxLayout(MainWidget);
2layout建構函式傳遞NULL,呼叫QWidget的setlayout設定佈局
QVBoxLayout* MainQVboxLayout=new QVBoxLayout();
MainWidget->setLayout(MainQVboxLayout);
注意,當一個widget已經存在佈局的時候。呼叫setLayout會失敗,如果要設定,必須先通過Widget的 layout方法(
QLayout * |
Q:得到layout指標,delete後就能重新設定,不需要其他操作怎麼做的?
A:widget使用setLayout的時候會檢查原有的值是否為NULL,如果不為NULL就失敗,delete layout的時候,解構函式會將這個layout屬於的widget的這個值設定為0。
所以delete以後又可以設定了
QLayout::~QLayout()
{
Q_D(QLayout);
if (d->topLevel && parent() && parent()->isWidgetType() &&
((QWidget*)parent())->layout() == this)
((QWidget*)parent())->d_func()->layout = 0; //這裡設定了為0
}
Q:為什麼MainWindow呼叫setLayout失敗?
A:MainWindow是一個組合體,已經包含了預設的layout,要通過setcenterwidget來操作中間的一塊區域。
V H BOXlayout
在一個layout裡面新增另一個layout如下
FuncBarQHboxLayout=new QHBoxLayout();
MainQVboxLayout->addLayout(FuncBarQHboxLayout);
Q: delete MainQVboxLayout的時候 FuncBarQHboxLayout會被刪除嗎,還是需要自己處理?
A:不需要自己處理。刪除MainQVboxLayout的時候會自動刪除他add的layout
QBoxLayout::~QBoxLayout()
{
Q_D(QBoxLayout);
d->deleteAll(); //刪除了這些layout
}
在H 或者V layout裡面新增一個控制元件呼叫
layout->addWidget(xxx) 這個是依照次序新增的。從左到右,從上到下。
如果有些子類已經實現了一些spacer函式,比如Vbox Hbox,那麼用新增spacer用
一般不直接使用layout->addItem() addItem定義瞭如何新增,由子類實現,通常用layoutitem封裝一個widget或者spacer,把不同的類物件變成layout可以識別的
統一layoutitem,laytouitem可以容納很多東西
彈簧控制元件的構造和使用
SpacerItem(w,h,hPolicy,vPolicy)
w是優先的高度h是優先的寬度
hPolicy是水平方向上的策略
vPolicy是垂直方向上的策略。
如果是水平彈簧 那麼hPolicy=expanding vPolicy=minimum
如果是垂直彈簧那麼hPolicy=minimum vPolicy=expanding
GridLayout 新增控制元件和Spacer
新增控制元件用AddWidget
新增Spacer用AddItem
不管用哪個函式都要了解他的四個關鍵引數
row 控制元件起始單元格的行位置
column 控制元件起始單元格的列位置
rowspan 控制元件所佔的行個數
columnspan 控制元件所佔的列個數
例如 0 0 2 1就是該控制元件排放在0,0起始的位置,佔2行1列。
例如 2 3 4 2就是該控制元件排放在2,3起始的位置,佔4行2列。
同時需要設定控制元件的Policy。
佈局還有一個重要的值。是伸縮因子Stretch
Stretch反應的是控制元件和控制元件之間的比例。比如
setStretch(0,1)第0個位置的伸縮因子為1
setStretch(1,2)第1個位置的伸縮因子為2
因此第二個控制元件的大小盡量為第一個的兩倍。只能是儘量,因為還有其他的條件限制。比如maxsize,minsize,或者fixed策略minimal策略之類的。
另外一個是調控控制元件的間隔和邊界部分
layout可以使用 setspacing設定控制元件之間的間隔。gridlayout使用 setverticalspacing或者sethorizontalspacing 來設定
layout通過使用setcontentmargins來設定四周留白的間隔。
部分 Widget 可以通過setcontentmargins來設定四周留白的間隔。setcontentmargins主要是為layout設計使用的。不是所有的Widget都可以使用,有部分是可以的比如Label這一類,具體是否有用要看這個控制元件的具體實現。比如comboBox就是不可以的。