【QT入门】 Qt代码创建布局之栅格布局详解

news2024/11/24 16:48:08

往期回顾:

【QT入门】 Qt自定义信号后跨线程发送信号-CSDN博客

【QT入门】 Qt内存管理机制详解-CSDN博客

【QT入门】 Qt代码创建布局之水平布局、竖直布局详解-CSDN博客

 【QT入门】 Qt代码创建布局之栅格布局详解

一、什么是栅格布局

所谓栅格布局,就是指将窗口分割为行和列的网格,每个控件可以放置在网格中的一个单元格内。通过栅格布局,可以方便地实现控件的对齐和排列,使界面看起来更加整洁和美观。

1、栅格布局的特点

(1)控件按行和列的方式排列,形成一个网格状布局。
(2)可以指定每个控件所占据的行数和列数,实现灵活的布局。
(3)控件可以跨越多个行或列,实现复杂的布局效果。
(4)当窗口大小发生变化时,栅格布局会自动调整控件的位置和大小,确保布局的稳定性。

二、如何创建栅格布局

 1、QGridLayout

与水平、竖直布局类似的,创建栅格布局也需要用到相关的类QGridLayout

(1) 包含头文件

#include <QGridLayout>

(2)创建栅格布局

QGridLayout* pGridLayout = new QGridLayout(this); 

三、栅格布局实现登录界面示例 

1、界面分析:

我们最终想要达到这样一个效果:

可以很明显的看出来,这样一个登录窗口就是用了栅格布局的,左边的图片,右边的账号框、密码框、下面的按钮等,都分别占了大小不等的布局空间。

 先画一下大概的草图,看一下每个控件大概需要多少空间:

 2、代码分析:

2.1设置无边框和点击最小最大化设置
1.this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMaximizeButtonHint);

我们用了一个方法:setWindowFlags()来设置窗口属性,但是我写的时候发现还有一个类setWindowFlag(),我们对比一下 

setWindowFlags(Qt::WindowFlags flags)用于设置窗口的标志,可以同时设置多个标志。调用setWindowFlags方法会覆盖之前设置的所有窗口标志,因此需要在调用该方法时同时设置所有需要的标志。
setWindowFlag(Qt::WindowType flag, bool on = true)用于设置或清除单个窗口标志。通过传递Qt::WindowType枚举值和一个布尔值来设置或清除指定的窗口标志。
调用setWindowFlag方法只会影响指定的窗口标志,不会影响其他标志。
2.2设置输入框中的占位文本 
2、QLineEdit *pUserNameLineEdit = new QLineEdit(this);
   pUserNameLineEdit->setFixedSize(300,50);
   pUserNameLineEdit->setPlaceholderText("QQ号码/手机/邮箱");

setPlaceholderText是QLineEdit类的方法,用于设置输入框中的占位文本。这个文本通常用于提供对用户所需输入内容的提示或说明,当输入框为空且未获得焦点时显示,一旦用户开始输入内容,占位文本会自动消失。

2.3设置输入框中显示的字符模式 
 3、QLineEdit* pPasswordLineEdit = new QLineEdit(this);
    pPasswordLineEdit->setFixedSize(300, 50);
    pPasswordLineEdit->setPlaceholderText("密码");
    pPasswordLineEdit->setEchoMode(QLineEdit::Password);

setEchoMode是QLineEdit类的方法,用于设置输入框中显示的字符模式,常用于密码输入框等场景。该段代码设置了密码输入框的字符显示模式为密码模式,即输入的字符会被掩盖显示。

2.4添加各个控件到栅格布局 
void addWidget(QWidget *, int row, int column, int rowSpan, int columnSpan, Qt::Alignment = Qt::Alignment());

添加各个控件到栅格布局里面去还是用的addWidget(),但是栅格布局用的addWidget()参数是不一样的。

2.4.1各个参数分析
QWidget *widget要添加的控件指针,即将要放置在栅格布局中的控件。
int row控件要放置的起始行索引,即控件将从第几行开始放置。行索引从0开始计数。        
int column控件要放置的起始列索引,即控件将从第几列开始放置。列索引从0开始计数。
int rowSpan控件要占据的行数,即控件在垂直方向上要跨越的行数。例如,如果rowSpan为2,则控件将占据起始行和下一行的空间。
int columnSpan控件要占据的列数,即控件在水平方向上要跨越的列数。例如,如果columnSpan为2,则控件将占据起始列和下一列的空间。
Qt::Alignment alignment = Qt::Alignment()控件在其所在单元格内的对齐方式,默认为Qt::Alignment(),即默认对齐方式。可以通过指定不同的Qt::Alignment枚举值来设置控件在单元格内的对齐方式,例如Qt::AlignCenter表示居中对齐。

说白了几个参数分别就是,起始位置的行号和列号,然后是需要占据和行数和列数,最后是对齐方式 。

2.5设置控件的间隙
5、   
    pGridLay->setHorizontalSpacing(20);
    pGridLay->setVerticalSpacing(20);
    pGridLay->setContentsMargins(30,30,30,30);

在代码的最后,需要设置一下控件的水平间隙和垂直间隙,还有整个控件与边界的距离。

三、完整示例代码

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //设置无边框和点击最小最大化设置
    this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMaximizeButtonHint);

    //头像
    QLabel *pImageLabel=new QLabel(this);
    QPixmap pixmap(":/XXX/XXX/XXX/XXX");
    pImageLabel->setFixedSize(150,150);
    pImageLabel->setPixmap(pixmap);
    pImageLabel->setScaledContents(true);//控件内容的自适应

    //用户名
    QLineEdit *pUserNameLineEdit = new QLineEdit(this);
    pUserNameLineEdit->setFixedSize(300,50);
    pUserNameLineEdit->setPlaceholderText("QQ号码/手机/邮箱");

    QLineEdit* pPasswordLineEdit = new QLineEdit(this);
    pPasswordLineEdit->setFixedSize(300, 50);
    pPasswordLineEdit->setPlaceholderText("密码");
    pPasswordLineEdit->setEchoMode(QLineEdit::Password);

    QPushButton* pForgotButton = new QPushButton(this);
    pForgotButton->setText("找回密码");
    pForgotButton->setFixedWidth(80);

    QCheckBox* pRememberCheckBox = new QCheckBox(this);
    pRememberCheckBox->setText("记住密码");

    QCheckBox* pAutoLoginCheckBox = new QCheckBox(this);
    pAutoLoginCheckBox->setText("自动登录");

    QPushButton* pLoginButton = new QPushButton(this);
    pLoginButton->setFixedHeight(48);
    pLoginButton->setText("登录");

    QPushButton* pRegisterButton = new QPushButton(this);
    pRegisterButton->setFixedHeight(48);
    pRegisterButton->setText("注册账号");


    //创建栅格布局放进去
    QGridLayout *pGridLay = new QGridLayout(this);
    //void addWidget(QWidget *, int row, int column, int rowSpan, int columnSpan, Qt::Alignment = Qt::Alignment());
    //先是控件,然后是从第几行第几列开始,然后是占几行,占几列
    pGridLay->addWidget(pImageLabel,0,0,3,1);
    pGridLay->addWidget(pUserNameLineEdit,0,1,1,3);
    pGridLay->addWidget(pPasswordLineEdit,1,1,1,3);
    pGridLay->addWidget(pForgotButton, 2,1,1,1);
    pGridLay->addWidget(pRememberCheckBox, 2,2,1,1, Qt::AlignLeft | Qt::AlignVCenter);
    pGridLay->addWidget(pAutoLoginCheckBox, 2,3,1,1, Qt::AlignRight | Qt::AlignVCenter);
    pGridLay->addWidget(pLoginButton, 3,1,1,3);
    pGridLay->addWidget(pRegisterButton, 4,1,1,3);

    pGridLay->setHorizontalSpacing(20);
    pGridLay->setVerticalSpacing(20);

    pGridLay->setContentsMargins(30,30,30,30);

}

以上就是水平、垂直、栅格布局的综合运用。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

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

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

相关文章

vue动态渲染本地路径图片不显示的解决方案,v-fro 渲染本地图片路径不显示

1、第一种解决方法 如果直接使用本地路径渲染是渲染不出来的&#xff0c;因为这种情况下渲染时会发送网络请求加你的本地地址所以渲染不出来。 这样怎么能找到路径&#xff1f;解决方案如下 // 渲染正常渲染即可 <div v-for"(item, index) in imgPath" :key&quo…

Python时间

UTC ~ 北京时间 【差8小时】 格式化日期时间为字符串:strftime 时间戳-1970.1.1到现在的秒数:time.time() AttributeError: partially initialized module ‘datetime’ has no attribute ‘fromtimestamp’ (most likely due to a circular import) 改正&#xff1a;文件名和…

数学建模中的这些神仙图都是怎么画出来的?

在各大数模比赛中&#xff0c;如国赛、美赛、数维杯这些比赛中&#xff0c;获得 特等奖论文往往不仅在问题求解上有深度&#xff0c;更在图表的呈现上展现了高逼格的水平。数乐君将带大家揭示一些制作高逼格图片的绘制技巧&#xff0c;助你在论文中展现更专业、美观的图表。&am…

【力扣hot100】207 课程表(c++、python)解析

相关题目: 210 课程表2 【力扣hot100】207 课程表(c++、python)解析 1.官方题解:1.1深搜c++版本python版本1.2广搜c++版本1.官方题解: 这是一题经典的「拓扑排序」问题 给定一个包含 n 个节点的有向图 G,我们给出它的节点编号的一种排列,如果满足:对于图 G 中的任意…

用友BI方案:一键搞定财务、销售、生产等分析

别人家做用友的数据分析&#xff0c;从零开始搭建分析模型、设计BI数据可视化报表&#xff0c;反复测试修改&#xff0c;耗时耗力&#xff0c;效果未知。奥威BI做用友的数据分析&#xff0c;用用友BI方案&#xff0c;注册、下载执行&#xff0c;自动取数、计算指标、分析数据、…

国内用户掌握ChatGPT,你已超越万人!

在数字时代&#xff0c;掌握前沿技术往往意味着拥有更多的机遇和可能。ChatGPT&#xff0c;作为当前最热门的人工智能技术之一&#xff0c;已经证明了其在各个领域的广泛应用价值。但在中国&#xff0c;能熟练使用ChatGPT的人究竟领先了多少人&#xff1f;让我们深入探讨。>…

网络——套接字编程TCP

目录 服务端 创建套接字&#xff08;socket&#xff09; 服务端绑定&#xff08;bind&#xff09; 服务端监听&#xff08;listen&#xff09; 服务器接收&#xff08;accept&#xff09; 服务端处理&#xff08;read & write&#xff09; 客户端 创建套接字&#…

安捷伦Agilent 34401A数字万用表

181/2461/8938产品概述&#xff1a; Agilent34401A 万用表将准确性、速度、测量简便性和多功能性结合到坚固的 6 1/2 位数字万用表中&#xff0c;无论在工作台上还是在系统中都同样适用。您可以以 5 1/2 位数的价格获得 6 1/2 位数的性能。除了直流和交流电压、直流和交流电流…

瑞吉外卖实战学习--登录过滤器和判断是否登录过

完善登录功能 1、创建自定义过滤器LoginCheckFiler1.1通过WebFilter创建过滤器1.2 验证是否可以拦截请求1.3 代码 2、在启动类加入注解ServletComponentScan 用来扫描过滤器触发所有的过滤器ServletComponentScan 3、完善过滤器的处理逻辑3.1判断是否需要是要放行的请求3.2判断…

PTA引水入城

在一个遥远的国度&#xff0c;一侧是风景秀美的湖泊&#xff0c;另一侧则是漫无边际的沙漠。该国的行政区划十分特殊&#xff0c;刚好构成一个 N 行 M 列的矩形&#xff0c;如上图所示&#xff0c;其中每个格子都代表一座城市&#xff0c;每座城市都有一个海拔高度。 为了使居民…

【Java - 框架 - Lombok】(2) SpringBoot整合Lombok完成日志的创建使用 - 快速上手;

"SpringBoot"整合"Lombok"完成日志的创建使用 - 快速上手&#xff1b; 环境 “Java"版本"1.8.0_202”&#xff1b;“Lombok"版本"1.18.20”&#xff1b;“Spring Boot"版本"2.5.9”&#xff1b;“Windows 11 专业版_22621…

安科瑞智慧安全用电综合解决方案

概述 智慧用电管理云平台是智慧城市建设的延伸成果&#xff0c;将电力物联网技术与云平台的大数据分析功能相结合&#xff0c;实现用电信息的可视化管理&#xff0c;可帮助用户实现安全用电&#xff0c;节约用电&#xff0c;可靠用电。平台支持web&#xff0c;app&#xff0c;微…

113 链接集11--ctrl+左键单击多选

1.ctrl左键单击多选&#xff0c;单击单选 精简代码 <div class"model-list"><divmousedown.prevent"handleClick(item, $event)"class"model-list-item"v-for"item in modelList":key"item.id":class"{ model…

【超全详解一文搞懂】Scala基础

目录 Scala 01 —— Scala基础一、搭建Scala开发环境安装Scala编译器在IDEA中进行scala编码 二、Scala简介与概述Scala简介Scala概述Scala代码规范 三、理解Scala变量与数据类型Scala的变量与常量Scala和Java变量的区别 Scala的数据类型 四、Scala的程序逻辑1.表达式2.运算符3.…

SqlServer期末复习(数据库原理及应用)持续更新中

一、SQL语句 1.1 SQL语句知识引入 1.DDL语言(数据定义语言&#xff09;主要是进行定义/改变表的结构、数据类型、表之间的链接等操作&#xff0c;关键字CREATE、DROP、ALTER CREATE TABLE 表面( 列名1 数据类型&#xff0c; 列名2 数据类型&#xff0c; ) ALTER TABLE 表名&a…

GPU从虚拟化迈向池化:趋动OrionX产品的创新之路

/ 引言 / 随着人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;技术的飞速发展&#xff0c;图形处理单元&#xff08;GPU&#xff09;已成为数据中心和云计算环境中的关键资源。GPU的并行处理能力使其成为执行复杂计算任务的理想选择。 然而&#xff…

数据在内存的存储(2)【浮点数在内存的存储】

一.浮点数以什么形式存储在内存中 根据根据国际标准IEEE&#xff08;电气和电子工程协会&#xff09;754&#xff0c;任意一个二进制浮点数V都可以存储为这样的形式&#xff1a; V&#xff08;-1&#xff09;^S*M*2^E。 &#xff08;1&#xff09;&#xff08;-1&#xff09;^…

PEReDi 完全隐私的央行数字货币方案

第一个对完全隐私保护建模的方案&#xff0c;基于账户模型&#xff0c;要求交易双方都在线。 角色分类 中央银行 B B B&#xff1a;负责发行数字货币和货币政策&#xff0c;但不控制用户账户的状态&#xff0c;没有能力对交易的发送者或接收者进行去匿名化或披露与特定交易相…

【C++航海王:追寻罗杰的编程之路】queue

目录 1 -> queue的介绍和使用 1.1 -> queue的介绍 1.2 -> queue的使用 1.3 -> queue的模拟实现 1 -> queue的介绍和使用 1.1 -> queue的介绍 queue的文档介绍 1. 队列是一种容器适配器&#xff0c;专门用于在FIFO(先进先出)上下文中操作&#xff0c;其…

【C++】隐藏的this指针

文章目录 1.this指针的引出2.this指针的特性 1.this指针的引出 我们通过日期类来学习this指针&#xff0c;首先我们先定义一个日期类。 class Date { public:void Display(){cout << _year << "-" << _month << "-" << _d…