Qt可以使用layout对子控件进行布局,方便实现自适应布局。所有QWidget类可以通过调用QWidget::setLayout()
设置布局。
Qt 布局相关类
QBoxLayout
水平/垂直排列QHBoxLayout
水平排列布局QVBoxLayout
垂直排列布局
QGridLayout
网格布局QFormLayout
单表布局
QBoxLayout
子控件呈单行/单列布局,通过QBoxLayout::Direction
指定方向。
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QWidget *win = new QWidget();
QBoxLayout *layout = new QBoxLayout(QBoxLayout::LeftToRight, win);
layout->addWidget(new QPushButton("One"));
layout->addWidget(new QPushButton("Two"));
layout->addWidget(new QPushButton("Three"));
layout->addWidget(new QPushButton("Four"));
layout->addWidget(new QPushButton("Five"));
win->show();
return QApplication::exec();
}
QHBoxLayout 和 QVBoxLayout 仅是使用 LeftToRight 和 TopToBottom 创建一个 QBoxLayout。这两个类仅是方便使用。
缩放因子(stretch factor)
QBoxLayout 的一些成员函数有缩放因子参数,一般参数名是 stretch 。缩放因子决定 layout 在 水平/垂直 方向上的缩放时,子控件如何缩放。
- 如果所有子控件的缩放因子都不大于0,则根据子控件的 QWidget::sizePolicy() 缩放;
- 如果有子控件的缩放因子大于0,则根据缩放因子的比例分配扩大/缩小的空间。其中,缩放因子为0的子控件不会缩放(也就是说分配的变化空间为0)。
常用函数
- addWidget 添加子控件到layout,可以设置缩放因子
- addSpacing 添加指定大小的空白空间
- addStretch 添加指定缩放因子的可缩放空白空间,最小宽度为0
- setContentsMargins 设置外边距
- setSpacing 设置子控件间距
QGridLayout
子控件呈网格布局,addWidget
添加子控件时可以指定子控件的单元格下标和单元格占据的行数/列数。与 QBoxLayout一样,可以指定每一行/列的最高度/宽度和缩放因子。
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QWidget *win = new QWidget();
QGridLayout *layout = new QGridLayout(win);
layout->addWidget(new QPushButton(), 0, 0);
layout->addWidget(new QPushButton(), 0, 2);
layout->addWidget(new QPushButton(), 1, 0, 1, 1);
layout->addWidget(new QPushButton(), 1, 1, 1, 2);
layout->addWidget(new QPushButton(), 2, 0, 1, 2);
layout->addWidget(new QPushButton(), 2, 2, 1, 1);
layout->addWidget(new QPushButton(), 3, 0, 1, 3);
win->show();
return QApplication::exec();
}
addRow第二、三参数指定改单元格的行下表和列下标。第三、四参数指定改单元格占用行数和列数。
上述例子布局如下:
QFormLayout
单表布局本质上是一个n行两列的网格布局,是QGridLayout便利类。单表布局也提供了一些便于创建单表GUI的函数。