[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中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

QT Creator配置Kit的实现示例

《QTCreator配置Kit的实现示例》本文主要介绍了使用Qt5.12.12与VS2022时,因MSVC编译器版本不匹配及WindowsSDK缺失导致配置错误的问题解决,感兴趣的可以了解一下... 目录0、背景:qt5.12.12+vs2022一、症状:二、原因:(可以跳过,直奔后面的解决方法)三、解决方

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

spring AMQP代码生成rabbitmq的exchange and queue教程

《springAMQP代码生成rabbitmq的exchangeandqueue教程》使用SpringAMQP代码直接创建RabbitMQexchange和queue,并确保绑定关系自动成立,简... 目录spring AMQP代码生成rabbitmq的exchange and 编程queue执行结果总结s

Nginx添加内置模块过程

《Nginx添加内置模块过程》文章指导如何检查并添加Nginx的with-http_gzip_static模块:确认该模块未默认安装后,需下载同版本源码重新编译,备份替换原有二进制文件,最后重启服务验... 目录1、查看Nginx已编辑的模块2、Nginx官网查看内置模块3、停止Nginx服务4、Nginx

python urllib模块使用操作方法

《pythonurllib模块使用操作方法》Python提供了多个库用于处理URL,常用的有urllib、requests和urlparse(Python3中为urllib.parse),下面是这些... 目录URL 处理库urllib 模块requests 库urlparse 和 urljoin编码和解码

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC