1. 程式人生 > >Qt的UI佈局以及控制元件間隔(Spacing)邊距(Margins)

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 *
)得到原來的指標,然後刪除再呼叫setlayout。 

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就是不可以的。