QT基础 - 布局管理器间隔控件

目录

一. QVBoxLayout

二. QHBoxLayout

三. QGridLayout

四. QFormLayout

五. Spacers

六.总结


一. QVBoxLayout

QVBoxLayout 主要用于将控件在垂直方向上进行排列。

它具有以下特点:

  • 可以方便地管理和组织控件,使其按照垂直顺序依次排列。
  • 能够自动根据添加的控件数量和尺寸来调整布局的整体高度。
  • 提供了简单直观的方式来构建具有垂直层次结构的界面。

通过使用 QVBoxLayout,可以让界面的布局更加清晰、有序,易于维护和扩展。它在许多 Qt 应用程序中被广泛使用,以实现各种不同的界面布局需求。

属性

  • 通常没有特定的独特属性,而是继承自父类的一些通用布局属性。

方法

  • addWidget(QWidget *widget):添加一个控件到布局中。
  • addLayout(QLayout *layout):添加一个子布局到该布局中。

实例代码

#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>int main(int argc, char *argv[]) {QApplication a(argc, argv);QWidget widget;QVBoxLayout *layout = new QVBoxLayout(&widget);QPushButton *button1 = new QPushButton("按钮 1");QPushButton *button2 = new QPushButton("按钮 2");layout->addWidget(button1);layout->addWidget(button2);widget.show();return a.exec();
}

效果图:

二. QHBoxLayout

QHBoxLayout 是一种将控件按水平方向依次排列的布局管理器。

其主要特点包括:

  • 让控件在水平方向上整齐排列,保持水平方向的对齐和间隔。
  • 能够自动处理控件之间的间距和布局的整体宽度。
  • 提供了简洁高效的方式来构建具有水平布局结构的界面。

在实际应用中,常用于构建菜单栏、工具栏等具有水平排列控件需求的界面部分。它使得界面的水平布局更加规范和易于管理,增强了界面的可读性和易用性。例如,在一个图形编辑软件的工具栏中,各种工具按钮可以通过 QHBoxLayout 进行整齐的水平排列。

属性

  • 同 QVBoxLayout 一样,主要继承自通用布局属性。

方法

  • addWidget(QWidget *widget):向布局中添加一个控件。
  • addLayout(QLayout *layout):添加一个子布局。

实例代码

#include <QApplication>
#include <QWidget>
#include <QHBoxLayout>
#include <QPushButton>int main(int argc, char *argv[]) {QApplication a(argc, argv);QWidget widget;QHBoxLayout *layout = new QHBoxLayout(&widget);QPushButton *button1 = new QPushButton("按钮 1");QPushButton *button2 = new QPushButton("按钮 2");layout->addWidget(button1);layout->addWidget(button2);widget.show();return a.exec();
}

效果图:

三. QGridLayout

QGridLayout 是一种将控件以网格形式进行排列的布局管理器。

它具有以下显著特点:

  • 可以灵活地将控件放置在网格的特定行和列中,实现精确的布局控制。
  • 支持跨行和跨列的控件放置,以适应不同的布局需求。
  • 能够自动调整网格的尺寸和间距,以适应所包含控件的数量和大小。

这种布局方式非常适合构建具有规则表格结构或需要精确位置控制的界面。比如在一个数据录入界面中,可以将各个输入字段按照行列整齐地排列;在游戏界面中,也可以用它来布置各种游戏元素的位置。它使得界面布局更加规范、整齐,同时提供了较好的可扩展性和可维护性。

属性方面一般较少有其特有的属性。

方法主要有:

  • addWidget(QWidget *widget, int row, int col, int rowSpan = 1, int colSpan = 1):将控件添加到指定的行和列,并可指定跨的行数和列数。
  • addLayout(QLayout *layout, int row, int col):添加一个子布局到指定位置。

实例代码:

#include <QApplication>
#include <QWidget>
#include <QGridLayout>
#include <QLabel>int main(int argc, char *argv[]) {QApplication a(argc, argv);QWidget widget;QGridLayout *layout = new QGridLayout(&widget);QLabel *label1 = new QLabel("标签 1");QLabel *label2 = new QLabel("标签 2");QLabel *label3 = new QLabel("标签 3");layout->addWidget(label1, 0, 0);layout->addWidget(label2, 0, 1);layout->addWidget(label3, 1, 0);widget.show();return a.exec();
}

效果图:

四. QFormLayout

QFormLayout 是 Qt中的一个布局管理器,用于在窗口中创建表单布局。它能够根据需要自动调整表单元素的大小和位置,从而创建一个漂亮且具有一致性的表单界面。

QFormLayout 按照类似 HTML 表单的方式将窗口分割成行和列,每个表单元素都放置在一个单独的行中。每一行通常包含一个标签(用于描述表单元素的用途)和一个表单控件(如文本框、下拉框等)。

QFormLayout 具有以下优点:

  • 遵守不同平台的外观和感觉准则,支持不同的标签对齐方式。
  • 支持包装长行,对于具有小显示器的设备,可以将 QFormLayout 设置为包装长行,甚至包装所有行。
  • 提供了便捷的 API,用于创建标签-字段对。

属性

  • fieldGrowthPolicy:字段的增长方式,默认值取决于小部件或应用程序样式。
  • formAlignment:在布局的几何图形中保持窗体布局内容的对齐,默认值取决于小部件或应用程序样式。
  • horizontalSpacing:并排排列的小部件之间的间距,默认情况下,如果没有显式设置值,则布局的水平间距将从父布局或父小部件的样式设置继承。
  • verticalSpacing:垂直布局的小部件之间的间距,默认情况下,如果没有显式设置值,则布局的垂直间距将从父布局或父小部件的样式设置继承。
  • labelAlignment:标签的水平对齐,默认值取决于小部件或应用程序样式。
  • rowWrapPolicy:窗体行的换行方式,默认值取决于小部件或应用程序样式。

方法

  • addRow(QWidget *label, QWidget *field):在末尾新增一行,左侧添加标签,右侧添加控件。
  • addRow(QWidget *label, QLayout *field):在末尾新增一行,左侧添加标签,右侧添加布局。
  • addRow(const QString &labelText, QWidget *field):在末尾新增一行,使用指定的标签文本创建一个QLabel对象,并将其添加到左侧,右侧添加控件。
  • addRow(const QString &labelText, QLayout *field):在末尾新增一行,使用指定的标签文本创建一个QLabel对象,并将其添加到左侧,右侧添加布局。
  • insertRow(int row, QWidget *label, QWidget *field):在指定位置插入一行,左侧添加标签,右侧添加控件。
  • insertRow(int row, QWidget *label, QLayout *field):在指定位置插入一行,左侧添加标签,右侧添加布局。
  • insertRow(int row, const QString &labelText, QWidget *field):在指定位置插入一行,使用指定的标签文本创建一个QLabel对象,并将其添加到左侧,右侧添加控件。
  • insertRow(int row, const QString &labelText, QLayout *field):在指定位置插入一行,使用指定的标签文本创建一个QLabel对象,并将其添加到左侧,右侧添加布局。
  • setRowWrapPolicy(RowWrapPolicy policy):设置换行策略。
  • setWidget(int row, ItemRole role, QWidget *widget):设置行row所对应的控件。

代码示例:

#include <QApplication>
#include <QWidget>
#include <QFormLayout>
#include <QLabel>
#include <QLineEdit>int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget window;window.setWindowTitle("QFormLayout Example");QFormLayout *layout = new QFormLayout;layout->addRow(new QLabel("Name:"), new QLineEdit());layout->addRow(new QLabel("Age:"), new QLineEdit());window.setLayout(layout);window.show();return app.exec();
}

效果图:

五. Spacers

Spacers(间隔器)用于在布局中不同部件间增加间隔,以辅助解决一些布局无法完美解决的部件布局排列美观问题。Qt的spacer布局控件主要用于填充两个控件之间的间隔距离,当窗口缩放时,弹簧会把控件向两端(上下、左右)进行弹起,其弹起量随窗口的变化而变化。spacer分为vertical spacer(垂直弹簧)和horizontal spacer(水平弹簧)两种。

以下是一个使用Spacers的示例代码:

#include <QApplication>
#include <QWidget>
#include <QFormLayout>
#include <QLabel>
#include <QLineEdit>
#include <QSpacerItem>
#include<QPushButton>int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget window;window.setWindowTitle("Spacers Example");QFormLayout *layout = new QFormLayout;// 添加标签和输入框layout->addRow(new QLabel("Name:"), new QLineEdit());layout->addRow(new QLabel("Age:"), new QLineEdit());// 添加垂直间隔QSpacerItem *verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);layout->addItem(verticalSpacer);// 添加按钮layout->addRow(new QPushButton("OK"), new QPushButton("Cancel"));window.setLayout(layout);window.show();return app.exec();
}

效果图:

六.总结

  • QVBoxLayout:垂直布局管理器,用于将控件从上到下依次排列。
  • QHBoxLayout:水平布局管理器,用于将控件从左到右依次排列。
  • QGridLayout:网格布局管理器,用于将控件按照行和列的方式排列。
  • QFormLayout:表单布局管理器,用于将标签和输入控件配对排列。
  • Spacers:间隔器,用于在布局中不同部件间增加间隔.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/29907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tensorboard基本使用

tensorboard基本介绍 conda下安装tensorboard 使用conda安装 conda install tensorboard2、tensorboard的基本使用 1、创建一个tensorboard-test.py 代码如下 # tensorboard-test.py from tensorboardX import SummaryWriter# 创建一个"my-log"的tensorboard日志…

Vue10-实战快速上手

实战快速上手 我们采用实战教学模式并结合ElementUI组件库&#xff0c;将所需知识点应用到实际中&#xff0c;以最快速度带领大家掌握Vue的使用&#xff1b; 1、创建工程 注意&#xff1a;命令行都要使用管理员模式运行 1、创建一个名为hello-vue的工程vue init webpack hel…

Opencv高级图像处理

文章目录 Opencv高级图像处理图像坐标二值化滤波高斯滤波中值滤波 开闭运算检测霍夫圆检测边缘检测Canny边缘检测findContours区别傅里叶变换-高/低通滤波 直线检测 相机标定视频处理视频格式 模板摄像头处理&#xff08;带参调节&#xff09;单图片处理&#xff08;带参调节&a…

MFC绘制哆啦A梦

OnPaint绘制代码 CPaintDC dc(this); // 用于绘画的设备上下文CRect rc;GetWindowRect(rc);int cxClient rc.Width();int cyClient rc.Height();// 辅助线HPEN hPen CreatePen(PS_DOT, 1, RGB(192, 192, 192));HPEN hOldPen (HPEN)SelectObject(dc, hPen);MoveToEx(dc, cxC…

EasyCVR/EasyDSS无人机直播技术助力野生动物监测:开启野生动物保护新篇章

近日有新闻报道&#xff0c;一名挖掘机师傅在清理河道时&#xff0c;意外挖出一只稀有的扬子鳄&#xff0c;挖机师傅小心翼翼地将其放在一边&#xff0c;扬子鳄也顺势游回一旁的河道中。 随着人类对自然环境的不断探索和开发&#xff0c;野生动物及其栖息地的保护显得愈发重要。…

ROS(四)

write in advance 实验四&#xff0c;在经历了实验三的失败后&#xff0c;卷土重来。 幸运的是&#xff0c;此次实验很简单&#xff0c;很快就能搞定。 Part one 使用指令查看自己摄像头的设备号&#xff0c;如果报错&#xff0c;且你为虚拟机&#xff0c;可能是未在虚拟机处…

Elasticsearch docker 安装及基本用法

创建网络 首先通过命令创建一个网络 docker network create es-net然后查看网络 [rootDocker ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 4e315f5e3ae7 bridge bridge local a501a9f3b4ee es-net bridge local ebca66b02e8c host …

修改文件的权限(linux篇)

1.在yl用户下创建一个demo.txt文件 [rootlocalhost ~]# su yl [yllocalhost root]$ cd [yllocalhost ~]$ cd Desktop/ [yllocalhost Desktop]$ ls [yllocalhost Desktop]$ vim demo.txt 填入一些信息进行保存 2.查看文件信息以及所对应的组 [yllocalhost Desktop]$ ll 总用量…

MYSQL 四、mysql进阶 1(mysql逻辑架构以及查询流程)

一、mysql的逻辑架构 1. 逻辑架构剖析 1.1 服务器处理客户端请求 mysql是典型的c/s架构&#xff0c;即 client/server 架构&#xff0c;不论是客户端进程和服务器进程是采用哪种方式进行通信&#xff0c;最后实现的效果都是&#xff1a;客户端进程向服务器进程发送一段文本&am…

MySQL 创建数据表

创建MySQL数据表需要以下信息&#xff1a; 表名表字段名定义每个表字段 语法 以下为创建MySQL数据表的SQL通用语法&#xff1a; CREATE TABLE table_name (column_name column_type); 以下例子中我们将在 W3CSCHOOL 数据库中创建数据表w3cschool_tbl&#xff1a; CREAT…

大数据集群离线解析经纬度逆编码地址

背景 最近有个需要需求把经纬度解析为地址&#xff0c;那么通常解析地址市面上流行的方案就是调取百度、高德地图的接口进行解析。 难点 但是在用这个方案遇到一个问题就是企业认证的百度地图每天的逆编码解析为300w次&#xff0c;qps为100次/秒&#xff0c;对于日增上千万的…

Golang | Leetcode Golang题解之第166题分数到小数

题目&#xff1a; 题解&#xff1a; func fractionToDecimal(numerator, denominator int) string {if numerator%denominator 0 {return strconv.Itoa(numerator / denominator)}s : []byte{}if numerator < 0 ! (denominator < 0) {s append(s, -)}// 整数部分numer…

springboot 3.x 之 集成rabbitmq实现动态发送消息给不同的队列

背景 实际项目中遇到针对不同类型的消息&#xff0c;发送消息到不同的队列&#xff0c;而且队列可能还不存在&#xff0c;需要动态创建&#xff0c;于是写了如下代码&#xff0c;实践发现没啥问题&#xff0c;这里分享下。 环境 springboot 3.2 JDK 17 rabbitMQ模型介绍 图片…

TwinCAT3 Scope Y-T NC Project的使用方法(电机参数监控时序图)

TwinCAT3 Scope Y-T NC Project的使用方法 图中有两个电机 在程序中添加两个电机轴 右键点击解决方案&#xff0c;然后添加Scope YT Project 记录绝对位置&#xff0c;速度&#xff0c;相对位置&#xff0c;加速度&#xff0c;跟随误差 如果不是本地的虚拟轴&#xff0c;则可以…

OpenCV中的圆形标靶检测——findCirclesGrid()(二)

本章我们开始讲解基于层次聚类的标靶检测算法。当我们调用如下API,且flags中包含cv::CALIB_CB_CLUSTERING标志位时,将会执行基于层次聚类的斑点检测算法。算法支持对称标靶和非对称标靶两类,相应的需要将下述flags设为包含CALIB_CB_SYMMETRIC_GRID或CALIB_CB_ASYMMETRIC_GRI…

JVM性能优化工具及问题排查

jvm性能优化工具 jdk提供给我们了很实用的工具来分析JVM的状态&#xff0c;线程以及配置&#xff0c;这些工具包含于jdk中&#xff0c;并且以java实现&#xff0c;是JVM性能优化必不可少的工具集&#xff0c;这些工具都在$JAVA_HOME/bin下 jps、jinfo、jstack、jmap、jstat基本…

打开nginx连接的php页面报错502

目录 问题描述&#xff1a; 原因&#xff1a; 1. 使用 Unix 域套接字&#xff08;Unix Socket&#xff09; 区别和优势&#xff1a; 2. 使用 TCP/IP 套接字 区别和优势&#xff1a; 如何选择 扩展&#xff1a;Rocky_Linux9.4安装PHP的步骤&#xff1a; 使用Remi存储库…

NLP入门——基于梯度下降法分类的应用

问题分析 我们前面研究的都是基于统计的方法&#xff0c;通过不同的统计方法得到不同的准确率&#xff0c;通过改善统计的方式来提高准确率。现在我们要研究基于数学的方式来预测准确率。 假设我们有一个分词 s_{class,word}&#xff0c;class是该对象的类别&#xff0c;word…

【漏洞复现】金和OA C6 download.jsp 任意文件读取漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

AI数据分析:Excel表格智能判断数据起点来计算增长率

工作任务&#xff1a;计算Excel表格中2023年1月到2024年4月的总增长率和复合增长率。 如果数据都有的情况下&#xff0c;公式很简单&#xff1a; 总增长率 (O2-B2)/B2 复合增长率 POWER((O2/B2),1/13)-1 但是&#xff0c;2023年1月、2月、3月的数据&#xff0c;有些有&…