QT之LayOut布局
文章目录
- QFormLayout
- QGridLayout
- QFormLayout、QGridLayout、QHBoxLayout、QVBoxLayout综合案例
- 用QFormLayout 代替 界面左边部分的QGridLayout
QFormLayout
#include "widget.h"#include <QFormLayout>
#include <QLineEdit>Widget::Widget(QWidget *parent): QWidget(parent)
{//固定窗口大小setFixedSize(250,200);// 创建表单布局指针QFormLayout *qLayout=new QFormLayout(this);QLineEdit *le1=new QLineEdit(); // 输入学号QLineEdit *le2=new QLineEdit(); // 输入姓名QLineEdit *le3=new QLineEdit(); // 输入学校qLayout->addRow("学号",le1);qLayout->addRow("姓名",le2);qLayout->addRow("学校",le3);qLayout->setSpacing(10);// WrapAllRows将标签显示在单行编辑框上面//qLayout->setRowWrapPolicy(QFormLayout::WrapAllRows);// 当标签和单选编辑框,将标签显示在同一行。qLayout->setRowWrapPolicy(QFormLayout::WrapLongRows);qLayout->setLabelAlignment(Qt::AlignLeft); // 设置标签对齐方式setWindowTitle("表单布局测试案例");}
qLayout->setRowWrapPolicy(QFormLayout::WrapLongRows);效果
qLayout->setRowWrapPolicy(QFormLayout::WrapAllRows);效果
QGridLayout
#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent)
{button1=new QPushButton(this);button1->setText("第一区:顶部菜单栏选项");//button1->setFixedHeight(60); // 设置固定大小高度//把QPushButton控件的大小策略设定为在水平和垂直方向上都能自动扩展。//当窗口大小发生改变时,按钮能够依据布局的变化自动调整自身大小button1->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);button2=new QPushButton(this);button2->setText("第二区:侧边栏选项");//button2->setFixedWidth(150); // 设置固定大小宽度button2->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);button3=new QPushButton(this);button3->setText("第三区:底部选项");//button3->setFixedHeight(60);button3->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);button4=new QPushButton(this);button4->setText("第四区:子窗体选项");//button4->setFixedHeight(60);button4->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);//网格布局类pGrid_layouts=new QGridLayout();// 通过此函数设置左侧 顶部 右侧 底部边距,主要方便布局周围进行使用pGrid_layouts->setContentsMargins(0,0,0,0);// 用于设置布局四周的边距// pGrid_layouts->setMargin(30);//5.12开始被弃用pGrid_layouts->setContentsMargins(10,10,10,10);//设置QGridLayout中各个控件之间间距pGrid_layouts->setSpacing(0);// 显示位置// addWidget(参数1,参数2,参数3,参数4,参数5,参数6)/*1:我要插入的子布局对象2:插入的开始行3:插入的开始列4:占用的行数5:占用的列数6:指定对齐方式*/pGrid_layouts->addWidget(button1,0,1);pGrid_layouts->addWidget(button2,0,0,3,1);pGrid_layouts->addWidget(button3,2,1);pGrid_layouts->addWidget(button4,1,1);//给部件设置布局setLayout(pGrid_layouts);}
第一区:第0行、第1列
第二区:第0行、第0列、占用3行,1列
第三区:第1行、第1列
第四区:第2行、第1列
QFormLayout、QGridLayout、QHBoxLayout、QVBoxLayout综合案例
#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QTextEdit>
#include <QGridLayout>
#include <QPushButton>class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();private:// 1:左边 网格布局、表格布局QGridLayout *lLayout;QLabel *UserNumber;QLineEdit *UserNumberLineEdit;QLabel *UserName;QLineEdit *UserNameLineEdit;QLabel *UserSex;QComboBox *UserSexCombobox;QLabel *UserDepart;QTextEdit *UserDepartTextEdit;QLabel *UserAge;QLineEdit *UserAgeLineEdit;// 2:右边 水平布局QHBoxLayout *toprightlayout;QVBoxLayout *rightlayout;QLabel *MyselfInfo;QTextEdit *MyselfInfoTextEdit;// 3:右边底部QPushButton *okbutton,*cancelbutton;QHBoxLayout *buttomLayout;
};
#include "dialog.h"
#include <QFormLayout>Dialog::Dialog(QWidget *parent): QDialog(parent)
{setWindowTitle("员工信息");// 左边控件UserNumber=new QLabel("员工编号:");UserNumberLineEdit=new QLineEdit;UserName=new QLabel("员工姓名:");UserNameLineEdit=new QLineEdit;UserSex=new QLabel("员工性别:");UserSexCombobox=new QComboBox;UserSexCombobox->addItem("男");UserSexCombobox->addItem("女");UserDepart=new QLabel("所在部门:");UserDepartTextEdit=new QTextEdit;UserAge=new QLabel("员工年龄:");UserAgeLineEdit=new QLineEdit;// 网格布局lLayout=new QGridLayout();// addWidget(参数1,参数2,参数3,参数4,参数5,参数6)/*1:我要插入的子布局对象2:插入的开始行3:插入的开始列4:占用的行数5:占用的列数6:指定对齐方式*/lLayout->addWidget(UserNumber,0,0); // 员工编号lLayout->addWidget(UserNumberLineEdit,0,1);lLayout->addWidget(UserName,1,0);lLayout->addWidget(UserNameLineEdit,1,1);lLayout->addWidget(UserSex,2,0);lLayout->addWidget(UserSexCombobox,2,1);lLayout->addWidget(UserDepart,3,0);lLayout->addWidget(UserDepartTextEdit,3,1);lLayout->addWidget(UserAge,4,0);lLayout->addWidget(UserAgeLineEdit,4,1);//设置网格布局(QGridLayout)列拉伸系数的方法//有两列,拉伸系数分别为 1 和 3,那么第二列将获得比第一列多两倍的额外空间。lLayout->setColumnStretch(0,1);lLayout->setColumnStretch(1,3);// 右边上部分//右边为垂直布局里个人简历为垂直布局,其他信息为水平布局toprightlayout=new QHBoxLayout();toprightlayout->setSpacing(5);MyselfInfo=new QLabel("个人简历:");MyselfInfoTextEdit=new QTextEdit;QLabel* MyselfInfo1=new QLabel("其他信息:");QTextEdit* MyselfInfoTextEdit1=new QTextEdit;//个人简历加到垂直布局toprightlayout->addWidget(MyselfInfo1);toprightlayout->addWidget(MyselfInfoTextEdit1);rightlayout=new QVBoxLayout();//把水平布局放进主界面右边的垂直布局rightlayout->addWidget(MyselfInfo);//把其他信息放进水平布局rightlayout->addWidget(MyselfInfoTextEdit);rightlayout->addLayout(toprightlayout);// 右边下部分okbutton=new QPushButton("确认");cancelbutton=new QPushButton("退出");buttomLayout=new QHBoxLayout();buttomLayout->addStretch();buttomLayout->addWidget(okbutton);buttomLayout->addWidget(cancelbutton);QGridLayout *mlayout=new QGridLayout(this);//隐式设置Dialog的布局为mlayoutmlayout->setMargin(20);mlayout->setSpacing(10);mlayout->addLayout(lLayout,0,0); // 左边//mlayout->addLayout(qLayout,0,0);mlayout->addLayout(rightlayout,0,1); // 右上mlayout->addLayout(buttomLayout,1,0,1,2);//窗口会根据布局里内容的尺寸来自动调整初始大小,并且用户无法对窗口大小进行更改mlayout->setSizeConstraint(QLayout::SetFixedSize);//new QGridLayout(this);这里不隐式设定布局就要显示设置setLayout(mlayout);//不然界面无法显示//setLayout(mlayout);}
用QFormLayout 代替 界面左边部分的QGridLayout
#include "dialog.h"
#include <QFormLayout>Dialog::Dialog(QWidget *parent): QDialog(parent)
{setWindowTitle("员工信息");/*****QFormLayout *qLayout=new QFormLayout(this);// 隐式设置Dialog的布局为qLayout错误这里如果传了this就会把qLayout设置为定成布局,就只会显示qLayout的界面*****///Qt规则:当通过 new QLayout(widget) 创建布局时,会自动调用 widget->setLayout()//后果:Dialog 的布局被先后设置为 qLayout 和 mlayout,违反 单顶级布局原则QFormLayout *qLayout=new QFormLayout();QLineEdit *le1=new QLineEdit(); // 员工编号:QComboBox *le2=new QComboBox(); // 员工姓名:le2->addItem("男");le2->addItem("女");QLineEdit *le3=new QLineEdit(); // 员工性别:QTextEdit *le4=new QTextEdit(); // 所在部门:QLineEdit *le5=new QLineEdit(); // 员工年龄:qLayout->addRow("员工编号:",le1);qLayout->addRow("员工姓名:",le2);qLayout->addRow("员工性别:",le3);qLayout->addRow("所在部门:",le4);qLayout->addRow("员工年龄:",le5);qLayout->setSpacing(10);qLayout->setRowWrapPolicy(QFormLayout::WrapLongRows);qLayout->setLabelAlignment(Qt::AlignLeft); // 设置标签对齐方式// 右边上部分toprightlayout=new QHBoxLayout();toprightlayout->setSpacing(5);MyselfInfo=new QLabel("个人简历:");MyselfInfoTextEdit=new QTextEdit;QLabel* MyselfInfo1=new QLabel("其他信息:");QTextEdit* MyselfInfoTextEdit1=new QTextEdit;toprightlayout->addWidget(MyselfInfo1);toprightlayout->addWidget(MyselfInfoTextEdit1);rightlayout=new QVBoxLayout();rightlayout->addWidget(MyselfInfo);rightlayout->addWidget(MyselfInfoTextEdit);rightlayout->addLayout(toprightlayout);// 右边下部分okbutton=new QPushButton("确认");cancelbutton=new QPushButton("退出");buttomLayout=new QHBoxLayout();buttomLayout->addStretch();buttomLayout->addWidget(okbutton);buttomLayout->addWidget(cancelbutton);QGridLayout *mlayout=new QGridLayout(this);//隐式设置Dialog的布局为mlayoutmlayout->setMargin(20);mlayout->setSpacing(10);//mlayout->addLayout(lLayout,0,0); // 左边mlayout->addLayout(qLayout,0,0);mlayout->addLayout(rightlayout,0,1); // 右上mlayout->addLayout(buttomLayout,1,0,1,2);//窗口会根据布局里内容的尺寸来自动调整初始大小,并且用户无法对窗口大小进行更改mlayout->setSizeConstraint(QLayout::SetFixedSize);//setLayout(mlayout);}
两个显示效果都是这个
相关文章:

QT之LayOut布局
文章目录 QFormLayoutQGridLayoutQFormLayout、QGridLayout、QHBoxLayout、QVBoxLayout综合案例用QFormLayout 代替 界面左边部分的QGridLayout QFormLayout #include "widget.h"#include <QFormLayout> #include <QLineEdit>Widget::Widget(QWidget *p…...

无需配置光猫,使用网管交换机配合路由器的IPTV功能实现单线复用
一、背景 弱电箱和电视柜只预留了一根网线,路由器放在电视柜,想实现既可以上网又可以正常观看iptv,本文提供了一种方法。 二、准备工作 1、带iptv功能的路由器;2、水星sg105pro网管交换机;3、网线若干; …...
C++类与对象--1 特性一:封装
C面向对象三大特性: (1)封装;(2)继承;(3)多态; C认为万物皆是对象,对象上有对应的属性(数据)和行为(方法&…...

Linux:计算机的层状结构
1.冯诺依曼体系结构 我们常见的计算机,如笔记本、台式机。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系结构。 CPU:运算器和控制器组成。运算器主要工作是做算术运算和逻辑运算。控制器主要工作是协调设备之间信息流动的…...

【SpringBoot】关于MP使用中配置了数据库表前缀的问题
problem 使用MP时,在application.yml配置文件中配置了MP匹配数据库表中的表名时的前缀作了规定,如下: 那么当我运行时报错了错误,报错信息如下: 因为我数据库表的书类表名是book,MP在匹配时使用了表名前…...

AI 赋能防艾宣传:从创意到实践,我的 IP 形象设计之旅
在数字技术飞速发展的今天,如何让严肃的健康传播变得更有温度、更具吸引力?作为一名参与防艾宣传实践的学生,我尝试通过 AI 工具构建专属 IP 形象,让防艾知识从 "被动接受" 转化为 "主动探索"。这篇文章将分享…...

Redis 事务与管道:原理、区别与应用实践
在现代分布式系统开发中,Redis 作为高性能的内存数据库,其事务处理和管道技术是开发者必须掌握的核心知识点。本文将深入探讨 Redis 事务和管道的实现原理、使用场景、性能差异以及最佳实践,帮助开发者根据实际需求选择合适的技术方案。 一、…...
每日算法刷题Day9 5.17:leetcode定长滑动窗口3道题,用时1h
9. 1652.拆炸弹(简单,学习) 1652. 拆炸弹 - 力扣(LeetCode) 思想 为了获得正确的密码,你需要替换掉每一个数字。所有数字会 同时 被替换。 如果 k > 0 ,将第 i 个数字用 接下来 k 个数字之和替换。如果 k < 0…...

手机打电话时如何将通话对方的声音在手机上识别成文字
手机打电话时如何将通话对方的声音在手机上识别成文字 --本地AI电话机器人 上一篇:手机打电话时由对方DTMF响应切换多级IVR语音应答(一) 下一篇:手机打电话时由对方DTMF响应切换多级IVR语音应答(二) 一、…...

重排序模型解读:gte-multilingual-reranker-base 首个GTE系列重排模型诞生
模型介绍 gte-multilingual-reranker-base 模型是 GTE 模型系列中的第一个 reranker 模型,由阿里巴巴团队开发。 模型特征: Model Size: 306MMax Input Tokens: 8192 benchmark 关键属性: 高性能:与类似大小的 reranker 模型…...
C++学习:六个月从基础到就业——C++11/14:列表初始化
C学习:六个月从基础到就业——C11/14:列表初始化 本文是我C学习之旅系列的第四十三篇技术文章,也是第三阶段"现代C特性"的第五篇,主要介绍C11/14中的列表初始化特性。查看完整系列目录了解更多内容。 引言 在C11之前&a…...
SQL语句执行问题
执行顺序 select [all|distinct] <目标列的表达式1> AS [别名], <目标列的表达式2> AS [别名]... from <表名1或视图名1> [别名],<表名2或视图名2> [别名]... [where <条件表达式>] [group by <列名>] [having <条件表达式>] [ord…...
2025系统架构师---选择题知识点(押题)
1.《计算机信息系统安全保护等级划分准则》(GB 17859-1999)由低到高定义了五个不同级别的计算机系统安全保护能力。 第一级:用户自主保护级---通过隔离用户与数据实现访问控制,保护用户信息安全; 第二级:系统审计保护级---实施更细粒度的访问控制,通过审计和隔离资源确…...
flutter flutter run 运行项目卡在Running Gradle task ‘assembleDebug‘...
flutter run --verbose在运行flutter run 可以看到是卡在哪一步 最重要的就是自己查看日志,具体哪一步有问题flutter run --verbose使用这个,运行了项目会将错误信息放在控制台 可能原因 静态资源问题如果:图片、字体文件等没有在pubspec.yam…...
P5682 [CSP-J2019 江西] 次大值
P5682 [CSP-J2019 江西] 次大值 题目描述 Alice 有 n n n 个正整数,数字从 1 ∼ n 1 \sim n 1∼n 编号,分别为 a 1 , a 2 , … , a n a_1,a_2, \dots , a_n a1,a2,…,an。 Bob 刚学习取模运算,于是便拿这 n n n 个数进行练习&…...
Elasticsearch 性能优化面试宝典
Elasticsearch 性能优化面试宝典 🚀 目录 设计调优 🏗️写入调优 ⚡查询调优 🔍综合设计 💎总结 📝设计调优 🏗️ 面试题1:索引设计优化 题目: 假设需要设计一个电商商品索引,日增数据量1TB,要求支持多维度查询(名称、分类、价格区间)。请说明索引设计的关…...

【论文阅读】人脸修复(face restoration ) 不同先验代表算法整理2
文章目录 一、前述二、不同的先验及代表性论文2.1 几何先验(Geometric Prior)2.2 生成式先验(Generative Prior)2.3 codebook先验(Vector Quantized Codebook Prior)2.4 扩散先验 (Diffusion Pr…...

无监督学习在医疗AI领域的前沿:多模态整合、疾病亚型发现与异常检测
引言 人工智能技术在医疗领域的应用正经历着从辅助决策向深度赋能的转变。无监督学习作为人工智能的核心范式之一,因其无需大量标注数据、能够自动发现数据内在规律的特性,在医疗AI领域展现出独特优势。尤其在2025年,无监督学习技术在医疗AI应用中呈现出多模态整合、疾病亚…...

计算机操作系统概要
不谋万世者,不⾜谋⼀时。不谋全局者 ,足谋⼀域 。 ——陈澹然《寤⾔》《迁都建藩议》 操作系统 一.对文件简单操作的常用基础指令 ls ls 选项 目录或⽂件名:罗列当前⽬录下的⽂件 -l:以长格式显示⽂件和⽬录的详细信息 -a 或 --all&…...
C语言进阶-数组和函数
C语言 一、数组 一维数组 通过数组,可以一次性的分配多个同类型的连续存储区 语法: 类型 数组名字[元素个数]; 例:int arr[6]; arr占用内存6个整型大小的连续存储空间 注意: 通过下标可以区分数组的每个…...

图片通过滑块小图切换大图放大镜效果显示(Vue3)
图片通过滑块小图切换大图放大镜效果显示 实现目标: 显示一组图片列表,鼠标进入小图记录当下小图下标,通过小图下标在数组中对应图片显示到大图位置; 鼠标进入大图位置时,带动滑块移动,并将放大两倍的大图…...

[SSL]1Panel添加阿里云DNS账户
1 创建一个子用户 将得到的key和secret贴到1panel的DNS账户配置中 添加权限 即可用DNS账号申请SSL证书...
C语言编程中的时间处理
最简单的time 在C语言编程中,处理时间最简单的函数就是time了。它的原型为: #include <time.h> time_t time(time_t *_Nullable tloc);返回自从EPOCH,即1970年1月1日的零点零时零分,到当前的秒数。 输入参数可以是NULL。…...

计算机网络 : 网络基础
计算机网络 : 网络基础 目录 计算机网络 : 网络基础引言1. 网络发展背景2. 初始协议2.1 初始协议2.2 协议分层2.2.1 软件分层的好处2.2.2 OSI七层模型2.2.3 TCP/IP五层(四层)模型 2.3 TCP/IP协议2.3.1TCP/IP协议与操作系统的关系&…...

C++跨平台开发:突破不同平台的技术密码
Windows 平台开发经验 开发环境搭建 在 Windows 平台进行 C 开发,最常用的集成开发环境(IDE)是 Visual Studio。你可以从Visual Studio 官网下载安装包,根据安装向导进行安装。安装时,在 “工作负载” 界面中ÿ…...
实现 STM32 PWM 输出:原理、配置与应用详解
实现 STM32 PWM 输出:原理、配置与应用详解 在嵌入式开发领域,STM32 微控制器凭借其强大的功能和丰富的外设资源,被广泛应用。PWM(脉冲宽度调制)作为 STM32 的重要功能之一,对于电机调速、LED 调光、信号合…...
Web 架构之负载均衡会话保持
文章目录 一、引言二、思维导图三、负载均衡会话保持的概念3.1 定义3.2 作用 四、负载均衡会话保持的实现方式4.1 基于 IP 地址原理代码示例(以 Nginx 为例)注释 4.2 基于 Cookie原理代码示例(以 HAProxy 为例)注释 4.3 基于 SSL …...

第一次做逆向
题目来源:ctf.show 1、下载附件,发现一个exe和一个txt文件 看看病毒加没加壳,发现没加那就直接放IDA 放到IDA找到main主函数,按F5反编译工具就把他还原成类似C语言的代码 然后我们看逻辑,将flag.txt文件的内容进行加…...

【Linux网络】传输层协议TCP
TCP协议 TCP全称为"传输控制协议(TransmissionControl Protocol"). 人如其名, 要对数据的传输进行一个详细的控制; TCP协议段格式 源、目的端口号:表示数据从哪个进程来,到哪个进程去。 32位序号、确认序号 4位TCP报头长度:表示该TCP头部有…...

AAAI-2025 | 中科院无人机导航新突破!FELA:基于细粒度对齐的无人机视觉对话导航
作者:Yifei Su, Dong An, Kehan Chen, Weichen Yu, Baiyang Ning, Yonggen Ling, Yan Huang, Liang Wang 单位:中国科学院大学人工智能学院,中科院自动化研究所模式识别与智能系统实验室,穆罕默德本扎耶德人工智能大学࿰…...