[Qt 教程之Widgets模块] —— QBoxLayout盒模型布局

Qt系列教程总目录

零、布局组件(Layouts)

在这里插入图片描述

控件描述
Vertical Layout垂直布局
Horizontal Layout水平布局
Grid Layout网格布局
Form Layout表单布局

各控件类的继承关系如下:

在这里插入图片描述

一、QBoxLayout

QBoxLayout可以在水平方向或垂直方向上排列控件,由QHBoxLayoutQVBoxLayout继承。

QHBoxLayout:水平布局,在水平方向上排列控件,即:左右排列。
QVBoxLayout:垂直布局,在垂直方向上排列控件,即:上下排列。

如下图:

在这里插入图片描述

QHBoxLayoutQVBoxLayout都公有继承于QBoxLayout,没有自己的成员函数。

二、QBoxLayout布局规则

详见QBoxLayout布局规则

三、创建QBoxLayout

QBoxLayout只有一个构造函数如下:

explicit QBoxLayout(Direction, QWidget *parent = nullptr);

其中Direction是一个枚举,表示控件布局的方向:

enum Direction 
{ 	
	LeftToRight, 
	RightToLeft, 
	TopToBottom, 
	BottomToTop,
    Down = TopToBottom, 
    Up = BottomToTop 
};

枚举描述如下:

枚举描述
QBoxLayout::LeftToRight0水平方向从左到右
QBoxLayout::RightToLeft1水平方向从右到左
QBoxLayout::TopToBottom2垂直方向从上到下
QBoxLayout::BottomToTop3垂直方向从下到上

QHBoxLayoutQVBoxLayout的继承如下:

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的常用函数如下:

1. 布局排列方向

Direction direction() const; // 获取当前排列方向
void setDirection(Direction); // 设置排列方向

QHBoxLayoutQVBoxLayout的构造函数可以看出,他们只是对QBoxLayout设置了不同的排列方向。

对于从QHBoxLayoutQVBoxLayout,还可重新设置排列方向。

在这里插入图片描述

2. 控件间距

void setSpacing(int spacing) override; // 设置控件间距大小
int spacing() const override; // 获取控件当前间距

3. 添加间隙

void addSpacing(int size); // 在控件队列最后面添加一个固定大小的间隙
void insertSpacing(int index, int size); // 在指定位置插入一个固定大小的间隙

4. 可拉伸控件(弹簧)

void addStretch(int stretch = 0); // 在控件队列最后面添加一个弹簧
void insertStretch(int index, int stretch = 0); // 在指定位置插入一个弹簧
// 一下函数不仅用于弹簧,也可用于其他控件
void setStretch(int index, int stretch); // 设置指定位置控件的拉伸系数
int stretch(int index) const; // 获取指定位置的拉伸系数

其中,index需要注意:

  • index从0开始;
  • 弹簧和原有控件分别占用一个index;
  • 插入后弹簧后,插入位置后面的index都会加 1;
  • 由于弹簧也是控件,所以布局的控件间距仍适用于弹簧与其他控件之间;
  • 如下图:
    • 布局(A),没有插入弹簧,三个PushButtonindex以此为0、1、2;
    • 布局(B),在PushButton1PushButton2之间插入一个弹簧,则PushButton2PushButton3index变为了2、3;
    • 布局(C),全部插入弹簧后,index依次变化。

所以手动插入弹簧时要注意index的变化。

在这里插入图片描述

对于拉伸系数stretch,即在sizePolicy的前提下,可拉伸控件按照什么样的比例分配空间,

  • 如果stretch0,该控件只保留自己最小的空间,不参与空间争夺
  • 如果sizePolicyFixed,该控件保持Fixed大小,也不参与空间争夺
  • 如果控件达到了sizePolicy或其他限制的大小,仍无法满足stretch所设置的比例,则控件以限制大小为准,不再按stretch所设置比例拉伸。
  • 如下图,
    • 布局(A),布局空间可以满足控件比例1:2:1PushButton1PushButton2PushButton3的大小分别为98:197:98
    • 布局(B),布局空间不足以满足控件比例1:2:3PushButton1PushButton2的比例明显不满足1:2
    • 如果布局空间不足以满足控件比例,这里还有个规律,就是先剥夺占比小的控件的空间,优先保证占比大的控件的比例。比如布局(B)中,先剥夺PushButton1的空间,不管他是不是满足控件比例,他们的大小分别为97:118:178,可以发现PushButton2PushButton3仍然满足2:3的比例。

在这里插入图片描述

5. 添加控件

// 在控件队列最后面添加一个新控件
// 其中可以指定控件的拉伸系数和对齐方式
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());
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万俟淋曦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值