
| 控件 | 描述 |
|---|---|
| Vertical Layout | 垂直布局 |
| Horizontal Layout | 水平布局 |
| Grid Layout | 网格布局 |
| Form Layout | 表单布局 |
各控件类的继承关系如下:

QBoxLayout可以在水平方向或垂直方向上排列控件,由QHBoxLayout和QVBoxLayout继承。
QHBoxLayout:水平布局,在水平方向上排列控件,即:左右排列。
QVBoxLayout:垂直布局,在垂直方向上排列控件,即:上下排列。
如下图:

QHBoxLayout和QVBoxLayout都公有继承于QBoxLayout,没有自己的成员函数。
QBoxLayout只有一个构造函数如下:
explicit QBoxLayout(Direction, QWidget *parent = nullptr);
其中Direction是一个枚举,表示控件布局的方向:
enum Direction
{
LeftToRight,
RightToLeft,
TopToBottom,
BottomToTop,
Down = TopToBottom,
Up = BottomToTop
};
枚举描述如下:
| 枚举 | 值 | 描述 |
|---|---|---|
| QBoxLayout::LeftToRight | 0 | 水平方向从左到右 |
| QBoxLayout::RightToLeft | 1 | 水平方向从右到左 |
| QBoxLayout::TopToBottom | 2 | 垂直方向从上到下 |
| QBoxLayout::BottomToTop | 3 | 垂直方向从下到上 |
QHBoxLayout和QVBoxLayout的继承如下:
QHBoxLayout::QHBoxLayout(QWidget *parent) : QBoxLayout(LeftToRight, parent){}
QHBoxLayout::QHBoxLayout() : QBoxLayout(LeftToRight){}
QVBoxLayout::QVBoxLayout(QWidget *parent) : QBoxLayout(TopToBottom, parent){}
QVBoxLayout::QVBoxLayout() : QBoxLayout(TopToBottom){}
他们构造的初始方向分别为:水平方向从左到右(QHBoxLayout)与垂直方向从上到下(QVBoxLayout)。
QBoxLayout的常用函数如下:
Direction direction() const; // 获取当前排列方向
void setDirection(Direction); // 设置排列方向
从QHBoxLayout和QVBoxLayout的构造函数可以看出,他们只是对QBoxLayout设置了不同的排列方向。
对于从QHBoxLayout和QVBoxLayout,还可重新设置排列方向。

void setSpacing(int spacing) override; // 设置控件间距大小
int spacing() const override; // 获取控件当前间距
void addSpacing(int size); // 在控件队列最后面添加一个固定大小的间隙
void insertSpacing(int index, int size); // 在指定位置插入一个固定大小的间隙
void addStretch(int stretch = 0); // 在控件队列最后面添加一个弹簧
void insertStretch(int index, int stretch = 0); // 在指定位置插入一个弹簧
// 一下函数不仅用于弹簧,也可用于其他控件
void setStretch(int index, int stretch); // 设置指定位置控件的拉伸系数
int stretch(int index) const; // 获取指定位置的拉伸系数
其中,index需要注意:
(A),没有插入弹簧,三个PushButton的index以此为0、1、2;(B),在PushButton1和PushButton2之间插入一个弹簧,则PushButton2和PushButton3的index变为了2、3;(C),全部插入弹簧后,index依次变化。所以手动插入弹簧时要注意index的变化。

对于拉伸系数stretch,即在sizePolicy的前提下,可拉伸控件按照什么样的比例分配空间,
stretch为0,该控件只保留自己最小的空间,不参与空间争夺sizePolicy为Fixed,该控件保持Fixed大小,也不参与空间争夺sizePolicy或其他限制的大小,仍无法满足stretch所设置的比例,则控件以限制大小为准,不再按stretch所设置比例拉伸。(A),布局空间可以满足控件比例1:2:1,PushButton1、PushButton2和PushButton3的大小分别为98:197:98。(B),布局空间不足以满足控件比例1:2:3,PushButton1和PushButton2的比例明显不满足1:2。(B)中,先剥夺PushButton1的空间,不管他是不是满足控件比例,他们的大小分别为97:118:178,可以发现PushButton2和PushButton3仍然满足2:3的比例。
// 在控件队列最后面添加一个新控件
// 其中可以指定控件的拉伸系数和对齐方式
void addWidget(QWidget *, int stretch = 0, Qt::Alignment alignment = Qt::Alignment());
// 在指定位置插入一个控件
void insertWidget(int index, QWidget *widget, int stretch = 0,
Qt::Alignment alignment = Qt::Alignment());