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

2023-10-17 23:30

本文主要是介绍[Qt 教程之Widgets模块] —— QBoxLayout盒模型布局,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Qt系列教程总目录

文章目录

    • 零、布局组件(Layouts)
    • 一、QBoxLayout
    • 二、QBoxLayout布局规则
    • 三、创建QBoxLayout
    • 四、成员函数
      • 1. 布局排列方向
      • 2. 控件间距
      • 3. 添加间隙
      • 4. 可拉伸控件(弹簧)
      • 5. 添加控件

零、布局组件(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());

这篇关于[Qt 教程之Widgets模块] —— QBoxLayout盒模型布局的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/228677

相关文章

Python datetime 模块概述及应用场景

《Pythondatetime模块概述及应用场景》Python的datetime模块是标准库中用于处理日期和时间的核心模块,本文给大家介绍Pythondatetime模块概述及应用场景,感兴趣的朋... 目录一、python datetime 模块概述二、datetime 模块核心类解析三、日期时间格式化与

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Python中的getopt模块用法小结

《Python中的getopt模块用法小结》getopt.getopt()函数是Python中用于解析命令行参数的标准库函数,该函数可以从命令行中提取选项和参数,并对它们进行处理,本文详细介绍了Pyt... 目录getopt模块介绍getopt.getopt函数的介绍getopt模块的常用用法getopt模

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类