QT之LayOut布局

news2025/5/18 5:57:12

文章目录

  • 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_OBJECT

public:
    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的布局为mlayout
    mlayout->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的布局为mlayout
    mlayout->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);


}

两个显示效果都是这个

在这里插入图片描述

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

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

相关文章

无需配置光猫,使用网管交换机配合路由器的IPTV功能实现单线复用

一、背景 弱电箱和电视柜只预留了一根网线&#xff0c;路由器放在电视柜&#xff0c;想实现既可以上网又可以正常观看iptv&#xff0c;本文提供了一种方法。 二、准备工作 1、带iptv功能的路由器&#xff1b;2、水星sg105pro网管交换机&#xff1b;3、网线若干&#xff1b; …

Linux:计算机的层状结构

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

【SpringBoot】关于MP使用中配置了数据库表前缀的问题

problem 使用MP时&#xff0c;在application.yml配置文件中配置了MP匹配数据库表中的表名时的前缀作了规定&#xff0c;如下&#xff1a; 那么当我运行时报错了错误&#xff0c;报错信息如下&#xff1a; 因为我数据库表的书类表名是book&#xff0c;MP在匹配时使用了表名前…

AI 赋能防艾宣传:从创意到实践,我的 IP 形象设计之旅

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

Redis 事务与管道:原理、区别与应用实践

在现代分布式系统开发中&#xff0c;Redis 作为高性能的内存数据库&#xff0c;其事务处理和管道技术是开发者必须掌握的核心知识点。本文将深入探讨 Redis 事务和管道的实现原理、使用场景、性能差异以及最佳实践&#xff0c;帮助开发者根据实际需求选择合适的技术方案。 一、…

手机打电话时如何将通话对方的声音在手机上识别成文字

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

重排序模型解读:gte-multilingual-reranker-base 首个GTE系列重排模型诞生

模型介绍 gte-multilingual-reranker-base 模型是 GTE 模型系列中的第一个 reranker 模型&#xff0c;由阿里巴巴团队开发。 模型特征&#xff1a; Model Size: 306MMax Input Tokens: 8192 benchmark 关键属性&#xff1a; 高性能&#xff1a;与类似大小的 reranker 模型…

【论文阅读】人脸修复(face restoration ) 不同先验代表算法整理2

文章目录 一、前述二、不同的先验及代表性论文2.1 几何先验&#xff08;Geometric Prior&#xff09;2.2 生成式先验&#xff08;Generative Prior&#xff09;2.3 codebook先验&#xff08;Vector Quantized Codebook Prior&#xff09;2.4 扩散先验 &#xff08;Diffusion Pr…

无监督学习在医疗AI领域的前沿:多模态整合、疾病亚型发现与异常检测

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

计算机操作系统概要

不谋万世者&#xff0c;不⾜谋⼀时。不谋全局者 &#xff0c;足谋⼀域 。 ——陈澹然《寤⾔》《迁都建藩议》 操作系统 一.对文件简单操作的常用基础指令 ls ls 选项 目录或⽂件名:罗列当前⽬录下的⽂件 -l&#xff1a;以长格式显示⽂件和⽬录的详细信息 -a 或 --all&…

图片通过滑块小图切换大图放大镜效果显示(Vue3)

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

[SSL]1Panel添加阿里云DNS账户

1 创建一个子用户 将得到的key和secret贴到1panel的DNS账户配置中 添加权限 即可用DNS账号申请SSL证书

计算机网络 : 网络基础

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

C++跨平台开发:突破不同平台的技术密码

Windows 平台开发经验 开发环境搭建 在 Windows 平台进行 C 开发&#xff0c;最常用的集成开发环境&#xff08;IDE&#xff09;是 Visual Studio。你可以从Visual Studio 官网下载安装包&#xff0c;根据安装向导进行安装。安装时&#xff0c;在 “工作负载” 界面中&#xff…

第一次做逆向

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

【Linux网络】传输层协议TCP

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

AAAI-2025 | 中科院无人机导航新突破!FELA:基于细粒度对齐的无人机视觉对话导航

作者&#xff1a;Yifei Su, Dong An, Kehan Chen, Weichen Yu, Baiyang Ning, Yonggen Ling, Yan Huang, Liang Wang 单位&#xff1a;中国科学院大学人工智能学院&#xff0c;中科院自动化研究所模式识别与智能系统实验室&#xff0c;穆罕默德本扎耶德人工智能大学&#xff0…

排序算法之基础排序:冒泡,选择,插入排序详解

排序算法之基础排序&#xff1a;冒泡、选择、插入排序详解 前言一、冒泡排序&#xff08;Bubble Sort&#xff09;1.1 算法原理1.2 代码实现&#xff08;Python&#xff09;1.3 性能分析 二、选择排序&#xff08;Selection Sort&#xff09;2.1 算法原理2.2 代码实现&#xff…

Linux常用命令42——tar压缩和解压缩文件

在使用Linux或macOS日常开发中&#xff0c;熟悉一些基本的命令有助于提高工作效率&#xff0c;tar 是 Linux 和 Unix 系统中用于归档文件和目录的强大命令行工具。tar 名字来自 "tape archive"&#xff08;磁带归档&#xff09;&#xff0c;最初用于将文件打包到磁带…

网络协议分析 实验七 FTP、HTTP、DHCP

文章目录 实验7.1 FTP协议练习二 使用浏览器登入FTP练习三 在窗口模式下&#xff0c;上传/下传数据文件实验7.2 HTTP(Hyper Text Transfer Protocol)练习二 页面提交练习三 访问比较复杂的主页实验7.3 DHCP(Dynamic Host Configuration Protocol) 实验7.1 FTP协议 dir LIST&…