控件 | 描述 |
---|---|
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());