1. 程式人生 > 實用技巧 >《QT Creator快速入門》第四章:佈局管理

《QT Creator快速入門》第四章:佈局管理

QLayout是佈局管理器基類,我們一般使用其派生類QBoxLayout(基本佈局管理器)、QGridLayout(柵格佈局管理器)、QFormLayout(表單佈局管理器)、QStackedLayout(棧佈局管理器)。

1、QBoxLayout(基本佈局管理器)下又有垂直佈局管理器QVBoxLayout和水平佈局管理器QHBoxLayout,垂直佈局管理器使其所有的部件都按照垂直方式排列,水平佈局管理器使其所有的部件都按照水平方式來排列。

在設計模式下我們可以通過“右鍵->佈局”或者工具欄上來選擇新增指定型別的佈局管理器,比如我們向Widget新增一個字型選擇控制元件和一個文字編輯控制元件後,再新增一個垂直佈局管理器後效果如下圖所示,拉伸視窗的話上面兩個控制元件大小也會隨之改變。通過上面的方法向Widget新增垂直佈局管理器實際上是在ui設計類中添加了以下程式碼:

將佈局管理器新增到視窗上後,這個佈局管理器和其上面的部件都會成為視窗的子部件,我們可以使用childern()方法來獲取一個部件的所有子部件列表(QObjectList *型別)。

也可以新增一個水平佈局管理器QHBoxLayout,其效果如下:

我們也可以在Widget的建構函式中自己實現垂直佈局管理器的程式碼:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);


    QVBoxLayout
* layout = new QVBoxLayout; //新建垂直佈局管理器 layout->addWidget(ui->fontComboBox); //通過addWidget向佈局管理器新增部件 layout->insertWidget(1, ui->textEdit); //通過insertWidget向佈局管理器新增部件 layout->setContentsMargins(20, 40, 20, 40); //設定佈局管理器到邊界的距離,依次為左右上下 layout->setSpacing(10); //設定佈局管理器中各個子部件間距 setLayout(layout);
//設定為當前Widget的佈局,佈局管理器和其部件成為當前Widget的子部件 }

上面我們在設計模式下下的Widget視窗上通過“右鍵-佈局”或選擇工具欄上的佈局項來新增的是頂級佈局管理器,我們也可以像新增子控制元件一樣選擇一個佈局管理器拖動到Widget上,然後在這個佈局管理器裡新增子控制元件,這樣新增的是普通的佈局管理器。

右鍵Widget部件可以看到新增的垂直佈局管理器的屬性設定(對於不是頂級佈局管理器直接右鍵佈局管理器檢視屬性),其含義如下所示:

其中的layoutStretch伸縮因子屬性是用來設定部件間的比例的,比如對於一個有兩個部件的垂直佈局管理器,我們將其layoutStretch設定為1,2的話則第二個部件的高度是第一個的兩倍,也可以通過向佈局管理器新增部件的addWidget()方法的第二個引數來設定

伸縮因子。

還有一個layoutSizeConstraint屬性用來約束視窗大小,它只對頂級佈局管理器有用,它的幾個值含義如下:

我們也可以向一個widge插入多個佈局管理器(通過設計模式下拖拽佈局管理器部件或程式碼實現都可以),如下為一個垂直佈局管理器和一個水平佈局管理器:

向一個Widget插入一個佈局管理器後實際上會新增一個Widget部件,如下的程式碼是在設計模式下向一個Widget視窗插入一個垂直佈局管理器後,再向垂直佈局管理器插入三個pushButton後ui類自動生成的程式碼:

也可以將一個佈局管理器放入另一個佈局管理器之中,在程式碼裡可以通過父佈局管理器的addLayout()方法。

2、QGridLayout(柵格佈局管理器)可以使部件按照行和列來佈局而不是像垂直佈局管理器或水平佈局管理器那樣所有部件只能呈一列或一行來顯示,以下是程式碼示例和效果:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    QGridLayout* layout = new QGridLayout;
    layout->addWidget(ui->fontComboBox, 0, 0, 1, 2); //新增部件,從0行0列開始,佔據1行2列
    layout->addWidget(ui->pushButton, 0, 2, 1, 1); //新增部件,從0行2列開始,佔據一行1列
    layout->addWidget(ui->textEdit, 1, 0, 1, 3); //新增部件,從1行0列開始,佔據1行3列

    setLayout(layout);
}

3、QFormLayout(表單佈局管理器)適用於有多個輸入控制元件(lineEditor、comboBox等),並且每個輸入控制元件都有一個對應的Label說明標籤的情況(如下圖所示),使用表單佈局管理器可以很方便的設定輸入控制元件的快捷鍵。我們在設計模式下向widget拖入一個Form Layout,然後雙擊它或右鍵選擇”新增窗體佈局行“來新增一個Label和輸入控制元件,在輸入標籤文字的時候我們加上(&N)就為對應的控制元件設定了加速鍵,比如設定標籤名稱為”姓名(&N)“,則程式執行時,輸入alt+n則相當於點選了姓名對應的輸入欄。在程式碼裡我們可以使用addRow方法來向表單佈局管理器新增表單行。

可以看到在佈局管理器中的部件預設是不能進行自定義的移動或拉伸的,我們可以使用一個QSpacerItem來設定部件之間的間隔。如下圖所示,我們分別在一個表單佈局管理器和一個水平佈局管理器中添加了Vertical Spacer和Horizontal Spacer,程式執行的時候這兩個分隔符是不顯示的:

上面通過設計模式下新增的分隔符對應生成的實現程式碼如下:

表單佈局管理器的屬性比基本佈局管理器的屬性增加了幾項,如下所示:

4、QWidget的sizePolicy(大小策略)屬性用來設定部件的預設佈局行為,其值如下所示:

通過以上可知,QWidget部件的sizeHint()和minimumSizeHint()會影響佈局管理器的佈局,sizeHint()方法獲取的是sizeHint,它是部件的建議大小,minimumSizeHint()方法獲取的是minimumSizeHint,它是部件的建議最小大小,不過如果使用minimumSize()方法設定了部件的最小大小,那麼minimumSizeHint屬性會被忽略。

可以看到sizePolicy的水平伸展因子和垂直伸展因子預設都為0,比如現在有一個水平佈局管理器,其上有兩個pushButton,我們將其中一個的sizePolicy的水平伸展因子設定為1,將另一個的水平伸展因子設定為2的話,可以看到當我們拉伸水平佈局管理器的時候當按鈕長度超過sizeHint的時候一個按鈕的長度始終是另一個的2倍。

比如對於前面我們使用的垂直分隔符,我們將其sizeHint屬性的高度設定為100,但程式執行的時候分隔符實際上並沒有達到100,因為其sizeType屬性為expanding,如果將其設定為Fixed的話則分隔符實際高度才會變成100。

再比如下圖中,一個水平佈局管理器下原有一個Push Button和一個Tool Button,如果我們再新增一個Radio Button的話可以看到只有Push Button的長度被縮小了,Tool Button的大小沒有變化,這其實是因為Push Button的sizePolicy屬性的水平策略預設為Minimum,而Push Button的水平策略預設為Fixed。

再比如一個垂直佈局管理器我們向它放置3個pushButton後預設效果如下圖左部分,我們點選其屬性可以看到雖然上邊距和下邊距及部件間的間距都為0,但效果其實不是這樣,因為pushButton的sizePolicy屬性的垂直策略是Fixed,我們將其修改為Minimum後效果如下圖的右部分:

QSizePolicy物件可以用來設定部件的sizePolicy屬性,通過部件的setSizePolicy()方法,如下為ui設計類裡為Widget視窗生成的sizePolicy屬性設定程式碼:

5、QSplitter類物件是分裂器部件,它類似於基本佈局管理器QBoxLayout,不同的是放在分裂器的部件可以隨著分裂器大小的改變而改變大小,比如在QBoxLayout的按鈕的垂直方向預設是不會被拉伸的,但是放到分裂器裡就可以。分裂器與基本佈局管理器另一點不同的是QSplitter繼承自QFrame,QBoxLayout則繼承自QObject,所以我們還可以設定分裂器的邊框顯示效果。在設計模式下新增分裂器的方法是:選擇要新增到分裂器的部件然後“右鍵-佈局-使用分裂器垂直/水平佈局”,或者在工具欄上選擇“使用分裂器垂直/水平佈局”。

6、設定夥伴和Tab鍵順序

前面的表單佈局管理器中自動給我們設定了標籤對應的夥伴部件,這樣輸入指定的加速鍵就可以切換到對應的夥伴部件上,我們也可以自己指定標籤的夥伴,方法是在設計模式下選擇工具欄上的“編輯夥伴”模式,選擇標籤然後拖動到指定的部件上,然後輸入f4進入普通模式,將標籤的文字中新增“&快捷鍵字母”,比如標籤文字設定成"labelText&l"的話對應部件的加速鍵就是alt+l。如果要在程式碼中設定標籤的夥伴可以使用QLabel的setBuddy()方法。

在設計模式中選擇工具欄上的“編輯Tab順序”模式可以對部件的Tab順序進行設定,也可以在程式碼中使用setTabOrder()方法來對部件的Tab順序進行設定。

7、定位器

在Qt Creator的左下角有一個搜尋定位器,輸入ctrl+k可以看到它的一些用法,比如輸入". "可以看到當前文件裡的C++類、類物件、類方法,輸入"l 10"可以定位到當前文件的第10行,輸入“? qpushbutton”可以轉到QPushButton類的幫助文件,輸入"p "可以看到當前專案中的所有檔案。