Qt的版面配置(layout)系統提供了一個簡單有效的方法來做child widget的版面編排。使用版面配置具有下列的優點:
其實使用者也可以直接經由撰寫程式碼做版面配置,但卻是相當不方便,因為每次修改都需要重新compile、link以及執行後才知道修改後的結果。有鑑於此,Qt也提供了好用的工具 - Qt designer。Qt designer是一個GUI視覺化的設計工具,能讓視窗版面配置更為快速、簡單,有關Qt Designer將會在後面章節說明,本章將對如何撰寫程式碼進行版面配置說做名。
首先介紹最簡單的版面配置方法,那就是使用Qt提供的基本的版面配置管理:QHBoxLayout、QVBoxLayout與QGridLayout。這些類別是繼承自QLayout類別(再繼承自QObject類別)。這些類別主要負責widget版面位置的管理,經由這些版面配置處理可以產生更複雜的版面配置。
下列的程式碼建立一個QHBoxLayout,將5個QPushButton放置其中,其結果如圖所示:
QWidget *window = new QWidget;
QPushButton *button1 = new QPushButton("One");
QPushButton *button2 = new QPushButton("Two");
QPushButton *button3 = new QPushButton("Three");
QPushButton *button4 = new QPushButton("Four");
QPushButton *button5 = new QPushButton("Five");
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);
layout->addWidget(button4);
layout->addWidget(button5);
window->setLayout(layout);
window->show();
QVBoxLayout的程式碼與上述的QHBoxLayout類似,其產生的結果如下:
而使用QGridLayout則有些微不同,因為必須要指定widget的行與列位置。
QWidget *window = new QWidget;
QPushButton *button1 = new QPushButton("One");
QPushButton *button2 = new QPushButton("Two");
QPushButton *button3 = new QPushButton("Three");
QPushButton *button4 = new QPushButton("Four");
QPushButton *button5 = new QPushButton("Five");
QGridLayout *layout = new QGridLayout;
layout->addWidget(button1, 0, 0);
layout->addWidget(button2, 0, 1);
layout->addWidget(button3, 1, 0, 1, 2);
layout->addWidget(button4, 2, 0);
layout->addWidget(button5, 2, 1);
window->setLayout(layout);
window->show();
第三個QPushButton佔據了2行,所以在QGridLayout::addWidget()中指定了第五個參數2。使用這種版面配置,對child widget做版面配置時將不需要將parent widget參數引進來,此版面配置會自動利用QWidget::setParent()把Parent widget傳進來。
當使用者使用某個layout於這個視窗應用程式,而在這個layout中加入其他widget(譬如上例中的PushButton),則這些widget都自動成為那個視窗應用程式使用此layout的child widget(記住,widget不能繼承自layout,只有widget之間才行)。
此外,你可以利用addLayout()在版面配置中再加入其他版面配置;addLayout()中加入的版面配置就會成為外面版面配置的child,即可形成更複雜的版面配置。
1. 设计一个窗体,安排好它的函数和属性。
2. 基本的layout包括四类,QHBoxLayout,QVBoxLayout,QGridLayout,QFormLayout。前两个将widget水平或竖直防止,grid将widget以格子的形式放置,formlayout将widget以row的形式放置。
3. layout的使用方法是,先定一个layout,再向这个layout中添加widget,然后使用父类中的setlayout(),设置这个widget的layout。
4. layout有一个setMenubar,可以使得Dialog也可以设置菜单栏。
5. 在定义类时,定义一个enum,之后就可以直接使用这个enum中的元素。
6. QT赋参数的方法为tr("Button %1").arg(i + 1)。
7. QGridLayout有setColumnStretch(int, int)方法,用于设置grid中格子的伸长因子,也就是能够占用多大的空间。
8. QDialogButtonBox指用于确定/退出的button组。它是这两类常用button的一个box组合。
9. 本例中涉及到的其它widget包括:
a. QTextEdit,文本编辑框,支持plain text和html text
b. QPushButton,按钮
c. QGroupBox,将widget以box的形式组织在一起
d. QLineEdit,行编辑框
e. QComboBox,下拉框
f. QSpinBox,spin框,提供数值选择。