Qt第三课 ----------布局

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言、C++和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂


布局

  • **作者前言**
  • 介绍
  • 垂直布局
  • 水平布局
  • 网格布局
  • 表单布局
  • Spacer
    • SpacerItem添加逻辑

介绍

前面我们写过很多的Qt代码, 我们可以通过代码去布局,
也就是每个控件所在的位置, 都需要计算坐标, 最终通过 setGeometry 或者 move ⽅式摆放过去.这种设定⽅式其实并不⽅便. 尤其是界⾯如果内容⽐较多, 不好计算. ⽽且⼀个窗⼝⼤⼩往往是可以调整的, 按照绝对定位的⽅式, 也⽆法⾃适应窗⼝⼤⼩.
还有就是通过ui文件手动布局,但是这种布局不太好,因为无法明确的分布好位置, 窗口的大小也很难控制,
所以就有以下布局

垂直布局

使⽤ QVBoxLayout 表⽰垂直的布局管理器 layout表示布局
属性如下:
在这里插入图片描述
这个只是一个布局管理器,所以没有信号函数
我们简单的写一个代码

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QVBoxLayout * verticallayout = new QVBoxLayout(this);//这里指定垂直管理器放到this中, 如果设置没有,后面就需要添加//创建三个按钮QPushButton * buttonOne = CreateButton(verticallayout);QPushButton * buttonTwo = CreateButton(verticallayout);QPushButton * buttonTherr = CreateButton(verticallayout);//this->setLayout(verticallayout);//如果布局创建没有指定对象树,需要使用}Widget::~Widget()
{delete ui;
}QPushButton * Widget::CreateButton( QVBoxLayout * verticallayout)
{QPushButton * button = new QPushButton("按");//这里不设置this因为我们要把按钮放到QVBoxLayout里verticallayout->addWidget(button);return button;
}

创建一个有三个按钮的垂直布局, 然后添加到this中
效果如下:
在这里插入图片描述
这个布局可以随着窗口的变化而变化,
需要注意的是: 一个widget窗口只能设置一个布局,
如下情况, 如果碰见一个widget窗口设置多个布局,可能里面是创建多个widget,每个widget添加一个布局,如图:
在这里插入图片描述
在Qt的ui文件里面设置这样,虽然我们看见的是一个widget添加了两个布局,其实不是,而是在在里面先创建了两个widget窗口,然后每个窗口添加一个布局,当我们运行出来进行拉伸窗口,就会发现, 里面的布局不会随窗口的变化而变化, 我们可以去查看对于的代码
如图:
在这里插入图片描述
可以看见里面嵌套了两个widget

水平布局

使⽤ QHBoxLayout 表⽰垂直的布局管理器. H 是 horizontal 的缩写.
水平管理器的属性和垂直管理器的是一样的
在这里插入图片描述
下面我们写一个简单的代码来演示一下

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
//    CreateLayout(this);}Widget::~Widget()
{delete ui;
}
void Widget::CreateLayout(QWidget * parent)
{//布局创建QHBoxLayout * horizontallayout = new QHBoxLayout();//布局添加控件horizontallayout->addWidget(new QPushButton("按钮"));horizontallayout->addWidget(new QPushButton("按钮"));horizontallayout->addWidget(new QPushButton("按钮"));horizontallayout->addWidget(new QPushButton("按钮"));parent->setLayout(horizontallayout);horizontallayout->addLayout(CreateVLayout());//水平布局里面嵌套垂直布局}QVBoxLayout * Widget::CreateVLayout()
{//布局创建QVBoxLayout * vLayout = new QVBoxLayout();//布局添加控件vLayout->addWidget(new QPushButton("按钮"));vLayout->addWidget(new QPushButton("按钮"));vLayout->addWidget(new QPushButton("按钮"));vLayout->addWidget(new QPushButton("按钮"));return vLayout;
}void Widget::on_pushButton_clicked()
{//添加QString name("窗口");ui->tabWidget->addTab(new QWidget(),name+QString::number(ui->tabWidget->currentIndex()));
}void Widget::on_pushButton_2_clicked()
{//删除当前的窗口if(ui->tabWidget->currentIndex() >=0)ui->tabWidget->removeTab(ui->tabWidget->currentIndex());
}void Widget::on_pushButton_3_clicked()
{CreateLayout(ui->tabWidget->currentWidget());ui->tabWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);}

效果:
在这里插入图片描述
注意:布局里面可以嵌套布局,Layout ⾥⾯可以再嵌套上其他的 layout, 从⽽达到更复杂的布局效果.

网格布局

Qt 中提供了 QGridLayout ⽤来实现⽹格布局的效果. 可以达到 M * N 的这种⽹格的效果
属性如下:
在这里插入图片描述
下面我们写一个简单的:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);CreateGridlayout(this);}Widget::~Widget()
{delete ui;
}QGridLayout *Widget::CreateGridlayout(QWidget * parent)
{//创建一个表格布局QGridLayout*  grid = new QGridLayout();//创建三个按钮QPushButton *buttonOne = new QPushButton("按钮");QPushButton *buttonTwo = new QPushButton("按钮");QPushButton *buttonThree = new QPushButton("按钮");grid->addWidget(buttonOne, 0,0);grid->addWidget(buttonTwo, 0,1);grid->addWidget(buttonThree, 5,100);//不会间隔很远parent->setLayout(grid);return grid;
}

效果图:

在这里插入图片描述
在代码中, 设置了 grid->addWidget(buttonThree, 5,100),这个代码, 虽然写了很大,但是实际运行出来间隔是不大的因为,每一个按钮都会占据一行或者一列,但是这个值和上⼀个值之间并
没有其他的元素,不会因为设置很大就间隔很多,

除此之外,我们会发现,不管是啥布局,创建出来的控件的大小和间隔都是一样的,如果我们想创建一些大小和间隔不同的控件, 就需要我们去调节拉伸系数(比例)

在此代码的基础上我们添加列拉伸系数看看

grid->setColumnStretch(0,0);grid->setColumnStretch(1,9);//第二列的大小是第一列大小的9倍

效果如下:
在这里插入图片描述
如果倍数为0的话,就是不参与拉伸,大小是固定的了

如果使用行的拉伸系数的话,直接使用会看不见效果的 直接设置 setRowStretch 效果不明显, 因为每个按钮的⾼度是固定的. 需要把按钮的垂直⽅向的 sizePolicy 属性设置为 QSizePolicy::Expanding 尽可能填充满布局管理器, 才能看到效果,
sizepolicy的其中的一个枚举类型,如图:
在这里插入图片描述
使⽤ setSizePolicy 设置按钮的尺⼨策略. 可选的值如下:
• QSizePolicy::Ignored : 忽略控件的尺⼨,不对布局产⽣影响。
• QSizePolicy::Minimum : 控件的最⼩尺⼨为固定值,布局时不会超过该值。
• QSizePolicy::Maximum : 控件的最⼤尺⼨为固定值,布局时不会⼩于该值。
• QSizePolicy::Preferred : 控件的理想尺⼨为固定值,布局时会尽量接近该值。
• QSizePolicy::Expanding : 控件的尺⼨可以根据空间调整,尽可能占据更多空间。
• QSizePolicy::Shrinking : 控件的尺⼨可以根据空间调整,尽可能缩⼩以适应空间。

我们重新写一个新的代码进一步演示

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QGridLayout * grid = CreateGridlayout(this);grid->setColumnStretch(0,1);//如果不设置,就会固定大小grid->setColumnStretch(1,9);//第二列的大小是第一列大小的9倍grid->setRowStretch(0,1);//如果不设置,就会固定大小grid->setRowStretch(1,2);//第二行的大小是第一行大小的2倍}Widget::~Widget()
{delete ui;
}QGridLayout *Widget::CreateGridlayout(QWidget * parent)
{//创建一个表格布局QGridLayout*  grid = new QGridLayout();//创建三个按钮QPushButton *buttonOne = CreateButton();QPushButton *buttonTwo =CreateButton();QPushButton *buttonThree = CreateButton();grid->addWidget(buttonOne, 0,0);grid->addWidget(buttonTwo, 0,1);grid->addWidget(buttonThree, 1,0);//不会间隔很远parent->setLayout(grid);return grid;
}QPushButton *Widget::CreateButton()
{QPushButton *button = new QPushButton("按钮");//给按钮设置在水平和垂直的方向尽可能的伸展button->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);return button;
}

效果图:
在这里插入图片描述

表单布局

使⽤ QFormLayout 创建表单,属于是 QGridLayout 的特殊情况, 专⻔⽤于实现两列表单的布局
这种表单布局多⽤于让⽤⼾填写信息的场景. 左侧列为提⽰, 右侧列为输⼊框
属性如下:

addRow(): 添加一行,通常包含一个标签和一个控件。
*addRow(QString, QWidget)**: 添加一行,使用字符串作为标签。
setLabelAlignment(): 设置标签的对齐方式。
setSpacing(): 设置控件之间的间距。
setMargin(): 设置布局的边缘间距。
写一个简单的代码:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setLayout(CreateForm());
}Widget::~Widget()
{delete ui;
}QFormLayout *Widget::CreateForm()
{//创建表单QFormLayout* form = new QFormLayout();//创建三个标签和输入框CreateLabel_InputBox_And_Add(form, "账号:","请输入账号");CreateLabel_InputBox_And_Add(form, "密码:","请输入密码");CreateLabel_InputBox_And_Add(form, "邀请码:","请输入邀请码");// 提交按钮QPushButton * button = new QPushButton("提交");form->addRow(button);form->setMargin(300);//边框距离form->setSpacing(50);form->setHorizontalSpacing(10);,水平方向的控件之间的间距return form;}void Widget::CreateLabel_InputBox_And_Add(QFormLayout *form, QString name,QString textValue)
{//创建标签QLabel * label = new QLabel(name);//创建输入框QLineEdit * lineEdit1 = new QLineEdit();lineEdit1->setPlaceholderText(textValue);form->addRow(label, lineEdit1);}

效果如下:
在这里插入图片描述

Spacer

使⽤布局管理器的时候, 可能需要在控件之间, 添加⼀段空⽩. 就可以使⽤ QSpacerItem 来表⽰.
这个在布局中添加这个,不太一样,下面我们演示一下:
属性如下:
在这里插入图片描述

代码如下:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);CreateLayot<QHBoxLayout>(this);
}Widget::~Widget()
{delete ui;
}template<typename v = QLayout>
v *  Widget::CreateLayot(QWidget * parent)
{//创建布局v* layout = new v();//创建一个间隙QSpacerItem * spacer= new QSpacerItem(200,100);if(typeid (v).name() != typeid (QGridLayout).name()){//这里的空白的间隙添加的位置是看添加的逻辑layout->addWidget(new QPushButton("按钮"));layout->addSpacerItem(spacer);layout->addWidget(new QPushButton("按钮"));}parent->setLayout(layout);}

效果图:
在这里插入图片描述

SpacerItem添加逻辑

如果我们要把QSpacerItem添加到第一个按钮前面, 我们需要把代码添加到前面就行,
如图:
在这里插入图片描述

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

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

相关文章

MySQL本地安装及密码重置常见错误处理

文章目录 一、MySQL下载二、配置环境变量三、MySQL初始化1.初始化MySQL数据库2.安装MySQL服务3.启动MySQL服务 四、密码重置 一、MySQL下载 官网地址&#xff1a;https://dev.mysql.com/downloads/mysql/5.5.html#downloads 下载完成后&#xff0c;直接解压缩到D盘 二、配置…

TBB开启并行编程之旅

本文基于小彭老师TBB课程&#xff0c;并对部分晦涩知识添加了更详细的解释与示例 第0章&#xff1a;从并发到并行 停滞的摩尔定律 你醒啦&#xff1f;免费午餐结束了&#xff01; 摩尔定律具体内容我们就不再提&#xff0c;从上图可以看到晶体管的密度的确仍在指数增长&…

「QT」几何数据类 之 QPointF 浮点型点类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

青藤深度参编的终端安全国家标准正式发布

近日&#xff0c;国家市场监督管理总局、国家标准化管理委员会发布中华人民共和国国家标准公告&#xff0c;由TC260&#xff08;全国网络安全标准化技术委员会&#xff09;归口&#xff0c;公安部第三研究所牵头的GB/T 29240-2024《网络安全技术 终端计算机通用安全技术规范》&…

[极客大挑战 2019]Secret File 1

[极客大挑战 2019]Secret File 1 审题 看到题目应该是一道简单的按照要求找flag的题目 知识点 跟着题目走 解题 一&#xff0c;查看源码 找到网站进入 点开发现 【注意它说没看清吗】 二&#xff0c;使用BP抓包试试 发现新出现了/action.php 抓到后放到Repeater中响应 得…

Day41 | 动态规划 :完全背包应用 完全平方数单词拆分(类比爬楼梯)

Day41 | 动态规划 &#xff1a;完全背包应用 完全平方数&&单词拆分&#xff08;类比爬楼梯&#xff09; 动态规划应该如何学习&#xff1f;-CSDN博客 01背包模板 | 学习总结-CSDN博客 完全背包模板总结-CSDN博客 难点&#xff1a; 代码都不难写&#xff0c;如何想…

ELK-Kibana配置

文章目录 一、什么是Kibana、有什么用&#xff1f;二、Kibana的安装与基本配置1. 下载Kibana安装包2. 解压安装包3. 修改Kibana配置文件4. 添加用户目录权限5. 启动Kibana6. 访问Kibana 三、Kibana的使用Index pattern的配置查看收集到的数据画图 一、什么是Kibana、有什么用&a…

kdump 应该怎么安装 linux-crashdump kdump-tools

sudo apt install linux-crashdump sudo apt install crash sudo apt install kdump-tools 1. 两个工具的关系 linux-crashdump kdump-tools 在 Ubuntu 上安装 kdump 功能&#xff0c;这两个包都是相关的&#xff0c;但有不同的作用. linux-crashdump 是一个元包&#xff08;…

pdf转excel;pdf中表格提取

一、问题描述 在工作中或多或少会遇到&#xff1a;需要将某份pdf中的表格数据提取出来&#xff0c;以便能够“修改使用”数据 可将pdf中的表格提取出来&#xff0c;解决办法还有点复杂 尤其涉及“pdf中表格不是标准的单元格”的时候&#xff0c;提取数据到excel不太容易 比…

ElasticSearch备考 -- 集群配置常见问题

一、集群开启xpack安全配置后无法启动 在配置文件中增加 xpack.security.enabled: true 后无法启动&#xff0c;日志中提示如下 Transport SSL must be enabled if security is enabled. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security b…

qt配合映美精取图开发

最近开发一个项目&#xff0c;用映美精相机配合halcon做取图开发&#xff0c;由于网上资料小特意写个记录。到映美精官网下载驱动&#xff0c;映美精官网&#xff0c;下载映美精的工具开发包SDK 映美精的SDK下载SDK后找到classlib文件夹 里面就是SDK新建一个qt程序&#xff0c…

springboot yml文件数据源出现警告/报黄/数据库配置警告问题

1、看一下数据源的依赖是不是都引入完整了 2、看一下数据源是否有拼写错误 上图就是数据源拼写错误

手机上用什么方法可以切换ip

手机上用什么方法可以切换IP&#xff1f;在某些特定情境下&#xff0c;用户可能需要切换手机的IP地址&#xff0c;以满足网络安全、隐私保护或绕过地域限制等需求。下面以华为手机为例&#xff0c;将详细介绍手机IP地址切换的几种方法&#xff0c;帮助用户轻松实现这一目标。 一…

python可视化将多张图整合到一起(画布)

这周有点事忙着&#xff0c;没时间重温刚结束的Mathurcup数学建模&#xff0c;这两天也是再看了下&#xff0c;论文还是赶紧挺烂的&#xff0c;但比国赛又有进步&#xff08;说起国赛又不得不抱怨了&#xff0c;基本其余省份都发了&#xff0c;但江西......哎&#xff09;。哎&…

vue2,vue3,uniapp,小程序实现前端url生成二维码

最近遇到一个项目&#xff0c;api返回url地址&#xff0c;前端通过地址生成二维码。 话不多说直接上代码&#xff0c;亲测有效&#xff0c;希望能帮助大家&#xff0c;同时如果有更好的方法希望大家能够分享 1、第一步&#xff0c;在项目的utils文件夹下面创建一个weapp-qrco…

【韩老师零基础30天学会Java】01章

什么是程序&#xff1f; JavaEE企业版 示例1 public class Test{public static void main(String[] args){int res11;System.out.println("result"res);}}D:\Java\code>javac Test.javaD:\Java\code>java Test 缁撴灉2D:\Java\code>javac Test.javaD:\Java…

华为交换机实现不同VLAN内的互通配置(汇聚层设备作为网关)

背景如下&#xff1a; 如下图所示&#xff0c;PC1和PC2分别属于VLAN 2和VLAN 3&#xff0c;通过接入层设备DeviceB接入汇聚层设备DeviceA。PC3属于VLAN 4&#xff0c;通过接入层设备DeviceC接入汇聚层设备DeviceA。DeviceC不做任何配置&#xff0c;当做HUB即插即用。汇聚层设备…

SpringBoot旅游酒店系统源码免费分享+本地部署及介绍 - 幽络源

初步介绍 这是一套基于SpringBoot的旅游酒店系统&#xff0c;含有前台和后台&#xff0c;需要注意的是图片文件是存放于target中的&#xff0c;因此不建议删除这个临时目录。 原文及源码获取链接 > SpringBoot旅游酒店管理系统免费分享-幽络源 所需环境 JDK1.8、Maven、…

Java开发中的分布式锁使用教程

1. 基于ZooKeeper的分布式锁 1.1 引入依赖 在项目的pom.xml文件中添加以下依赖&#xff1a; <dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>latest</version> </dep…

zynq pl设计中断问题

问题 逻辑工程师vivado工具生成的pl hdf文件后,通过xilinx的工具解析的的dts文件,会出现中断号异常的问题。 原始问题肯定是硬件表现为通讯异常,此处以网口为例,则网口不通。 网口查询 uboot下网口信息 如下命令查询到 两个mac下对应的phy,地址分别为4和6,和硬件设计一…