【Qt】控件概述(7)—— 布局管理器

news2024/10/8 11:12:21

布局管理器

  • 1. 布局管理器
  • 2. QVBoxLayout——垂直布局
  • 3. QHBoxLayout——水平布局
  • 4. QGridLayout——网格布局
  • 5. QFormLayout——表单布局
  • 6. QSpacer

1. 布局管理器

在我们之前值ui界面进行拖拽设置控件时,都是通过手动的控制控件的位置的。同时每个控件的位置都是要计算坐标,最终通过setGeometry或者move方法来进行摆放的,这种设定方式其实并不方便.尤其是界面如果内容比较多的时候,不好计算.而且⼀个窗口大小往往是可以调整的,按照绝对定位的方式,也无法自适应窗口大小,因此Qt引入了布局管理器“LayOut"机制

2. QVBoxLayout——垂直布局

核心属性:

属性说明
layoutLeftMargin左侧边距
layoutRightMargin右侧边距
layoutTopMargin上方边距
layoutBottomMargin下方边距
layoutSpacing相邻元素之间的间距

代码样例:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 创建三个按钮
    QPushButton* but1 = new QPushButton("按钮一");
    QPushButton* but2 = new QPushButton("按钮二");
    QPushButton* but3 = new QPushButton("按钮三");
    // 创建布局管理器,并把三个按钮添加到里面
    QVBoxLayout* layout = new QVBoxLayout();
    layout->addWidget(but1);
    layout->addWidget(but2);
    layout->addWidget(but3);
    // 将布局管理器不知道widget中
    this->setLayout(layout);
}

运行程序,可以看到此时界面上的按钮就存在于布局管理器中.随着窗口尺寸变化二发发改变.此时三个按钮的尺寸和位置,都是自动计算出来的.

在这里插入图片描述

通过上述代码的方式,只能给这个widget设定⼀个布局管理器.实际上也可以通过Qt Design在⼀个窗口中创建多个布局管理器.

在这里插入图片描述

但是当我们运行起来的时候,我们会发现当我们改变窗口大小的时候,这个布局管理器的大小并不会发生改变。这其实是因为我们使用Qt Designer创建布局管理器的时候其实实现创建了一个Widget,设置了geometry属性后才把这个layout设置到widget中,二实际上一个widget只能包含一个layout

3. QHBoxLayout——水平布局

二QHBoxLayout其实和QVBoxLayout属性是一致的,用法也是一致的。

属性说明
layoutLeftMargin左侧边距
layoutRightMargin右侧边距
layoutTopMargin上方边距
layoutBottomMargin下方边距
layoutSpacing相邻元素之间的间距

代码样例1

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 创建三个按钮
    QPushButton* but1 = new QPushButton("按钮一");
    QPushButton* but2 = new QPushButton("按钮二");
    QPushButton* but3 = new QPushButton("按钮三");
    // 创建布局管理器,并把三个按钮添加到里面
    QHBoxLayout* layout = new QHBoxLayout();
    layout->addWidget(but1);
    layout->addWidget(but2);
    layout->addWidget(but3);
    // 将布局管理器不知道widget中
    this->setLayout(layout);
}

在这里插入图片描述

代码样例2:也可以支持嵌套布局

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QPushButton* but1 = new QPushButton("but1");
    QPushButton* but2 = new QPushButton("but2");
    QVBoxLayout* vlayout = new QVBoxLayout();
    vlayout->addWidget(but1);
    vlayout->addWidget(but2);
    this->setLayout(vlayout);

    QPushButton* but3 = new QPushButton("but3");
    QPushButton* but4 = new QPushButton("but4");
    QHBoxLayout* hlayout = new QHBoxLayout();
    hlayout->addWidget(but3);
    hlayout->addWidget(but4);
    vlayout->addLayout(hlayout);
}

在这里插入图片描述

4. QGridLayout——网格布局

QGridLayout和QVBoxLayout,QHBoxLayout的用法相似,只不过QGridLayout是有行列的。

核心属性:

属性说明
layoutLeftMargin左侧边距
layoutRightMargin右侧边距
layoutTopMargin上方边距
layoutBottomMargin下方边距
layoutHorizontalSpacing相邻元素之间水平方向的间距
layoutVerticalSpacing相邻元素之间垂直方向的间距
layoutRowStretch行方向的拉伸系数
layoutColumnStretch列方向的拉伸系数

代码样例:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QPushButton* but1 = new QPushButton("but1");
    QPushButton* but2 = new QPushButton("but2");
    QPushButton* but3 = new QPushButton("but3");
    QGridLayout* layout = new QGridLayout();
    layout->addWidget(but1, 0, 0);
    layout->addWidget(but2, 1, 1);
    layout->addWidget(but3, 2, 2);
    this->setLayout(layout);
}

在这里插入图片描述

我们也可以对布局进行设置拉伸系数,也就是按一定的比例进行布局。

代码样例:水平方向设置拉伸系数

Widget::Widget(QWidget *parent)
 : QWidget(parent)
 , ui(new Ui::Widget)
{
     ui->setupUi(this);
     // 创建 6 个按钮
     QPushButton* btn1 = new QPushButton("按钮1");
     QPushButton* btn2 = new QPushButton("按钮2");
     QPushButton* btn3 = new QPushButton("按钮3");
     QPushButton* btn4 = new QPushButton("按钮4");
     QPushButton* btn5 = new QPushButton("按钮5");
     QPushButton* btn6 = new QPushButton("按钮6");
     // 创建⽹格布局管理器, 并且添加元素
     QGridLayout* layout = new QGridLayout();
     layout->addWidget(btn1, 0, 0);
     layout->addWidget(btn2, 0, 1);
     layout->addWidget(btn3, 0, 2);
     layout->addWidget(btn4, 1, 0);
     layout->addWidget(btn5, 1, 1);
     layout->addWidget(btn6, 1, 2);

     // 设置拉伸⽐例
     // 第 0 列拉伸⽐例设为 1;
     layout->setColumnStretch(0, 1);
     // 第 1 列拉伸⽐例设为 0, 即为固定⼤⼩, 不参与拉伸
     layout->setColumnStretch(1, 0);
     // 第 2 列拉伸⽐例设为 3, 即为第 2 列的宽度是第 0 列的 3 倍
     layout->setColumnStretch(2, 3);
     // 设置 layout 到窗⼝中.
     this->setLayout(layout);

}

在这里插入图片描述
另外,QGridLayout 也提供了setRowStretch 设置行之间的拉伸系数.上述案例中,直接设置setRowStretch 效果不明显,因为每个按钮的高度是固定的.需要把按钮的垂直方向的sizePolicy 属性设置为QSizePolicy::Expanding 尽可能填充满布局管理器,才能看到效果.

使用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);
     // 创建 6 个按钮
     QPushButton* btn1 = new QPushButton("按钮1");
     QPushButton* btn2 = new QPushButton("按钮2");
     QPushButton* btn3 = new QPushButton("按钮3");
     QPushButton* btn4 = new QPushButton("按钮4");
     QPushButton* btn5 = new QPushButton("按钮5");
     QPushButton* btn6 = new QPushButton("按钮6");
     // 设置按钮的 sizePolicy, 此时按钮的⽔平⽅向和垂直⽅向都会尽量舒展开
     btn1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
     btn2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
     btn3->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
     btn4->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
     btn5->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
     btn6->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
     // 创建⽹格布局管理器, 并且添加元素
     QGridLayout* layout = new QGridLayout();
     layout->addWidget(btn1, 0, 0);
     layout->addWidget(btn2, 0, 1);
     layout->addWidget(btn3, 1, 0);
     layout->addWidget(btn4, 1, 1);
     layout->addWidget(btn5, 2, 0);
     layout->addWidget(btn6, 2, 1);
     // 设置拉伸⽐例
     // 第 0 ⾏拉伸⽐例设为 1;
     layout->setRowStretch(0, 1);
     // 第 1 ⾏拉伸⽐例设为 0, 即为固定⼤⼩, 不参与拉伸
     layout->setRowStretch(1, 0);
     // 第 2 ⾏拉伸⽐例设为 3, 即为第 2 ⾏的宽度是第 0 ⾏的 3 倍
     layout->setRowStretch(2, 3);
     // 设置 layout 到窗⼝中.
     this->setLayout(layout);
}

在这里插入图片描述

5. QFormLayout——表单布局

QRormLayout表单布局,多用于给手机用户的信息,比如我们在学校里,qq群里会发收集每个人的电话号码的文档,其中这个文档中要输入学号,姓名,和电话,填完之后就可以直接进行提交了。

Widget::Widget(QWidget *parent)
 : QWidget(parent)
 , ui(new Ui::Widget)
{
     ui->setupUi(this);
     // 创建 layout
     QFormLayout* layout = new QFormLayout();
     this->setLayout(layout);
     // 创建三个 label
     QLabel* label1 = new QLabel("姓名");
     QLabel* label2 = new QLabel("学号");
     QLabel* label3 = new QLabel("电话");
     // 创建三个 lineEdit
     QLineEdit* lineEdit1 = new QLineEdit();
     QLineEdit* lineEdit2 = new QLineEdit();
     QLineEdit* lineEdit3 = new QLineEdit();
     // 创建⼀个提交按钮
     QPushButton* btn = new QPushButton("提交");
     // 把上述元素添加到 layout 中
     layout->addRow(label1, lineEdit1);
     layout->addRow(label2, lineEdit2);
     layout->addRow(label3, lineEdit3);
     layout->addRow(NULL, btn);
}

在这里插入图片描述

6. QSpacer

上述我们设置的布局中的按钮之间挨着都是比较近的,有的时候我们想要他们之间有些间隔,就可以用到QSapcer

核心属性:

属性说明
width宽度
height高度
hData水平方向的 sizePolicy (QSizePolicy::Ignored : 忽略控件的尺寸,不对布局产⽣影响)(QSizePolicy::Minimum :控件的最小尺寸为固定值,布局时不会超过该值。)(QSizePolicy::Maximum : 控件的最大尺寸为固定值,布局时不会小于该值。 )(QSizePolicy::Preferred : 控件的理想尺寸为固定值,布局时会尽量接近该值。)(QSizePolicy::Expanding : 控件的尺寸可以根据空间调整,尽可能占据更多空间。)(QSizePolicy::Shrinking : 控件的尺寸可以根据空间调整,尽可能缩小以适应空间。)
vData垂直方向的 sizePolicy 选项同上.
Widget::Widget(QWidget *parent)
 : QWidget(parent)
 , ui(new Ui::Widget)
{
     ui->setupUi(this);
     QHBoxLayout* layout = new QHBoxLayout();
     this->setLayout(layout);
     QPushButton* btn1 = new QPushButton("按钮1");
     QPushButton* btn2 = new QPushButton("按钮2");
     // 创建Spacer
     QSpacerItem* spacer = new QSpacerItem(200, 20);
     layout->addWidget(btn1);
     // 这个是按照添加的顺序来添加的,放在中间说明放在两个按钮的中间
     layout->addSpacerItem(spacer);
     layout->addWidget(btn2);
}

在这里插入图片描述

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

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

相关文章

Spring Boot新闻推荐系统:用户体验优化

3系统分析 3.1可行性分析 通过对本新闻推荐系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本新闻推荐系统采用JAVA作为开发语言,Spring Boot框…

STM32F407寄存器操作(DMA+SPI)

1.前言 前面看B站中有些小伙伴吐槽F4的SPIDMA没有硬件可控的CS引脚,那么今天我就来攻破这个问题 我这边暂时没有SPI的从机芯片,并且接收的过程与发送的过程类似,所以这里我就以发送的过程为例了。 2.理论 手册上给出了如下的描述 我们关注…

Graphviz是一个开源的图形可视化软件

官网没有给出代码示例,所以需要自己琢磨, 这里最底下给了一些简单的, 确实可以出很好看的图片 Graphviz介绍 Graphviz是一个开源的图形可视化软件,主要用于绘制各种类型的图表,如流程图、结构图、网络拓扑图等。它通…

【黑马点评】5 Redisson分布式锁

【黑马点评】5 Redisson分布式锁 5 分布式锁-redisson5.1 分布式锁-redission功能介绍5.2 分布式锁-Redission快速入门5.3 分布式锁-redission可重入锁原理5.4 分布式锁-redission锁重试和WatchDog机制5.5 分布式锁-redission锁的MutiLock原理5.6 总结 黑马点评跟做笔记之 5 Re…

如何使用ssm实现学生工作管理系统

TOC ssm794学生工作管理系统jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。…

Java爬虫技术:解锁1688商品搜索的新维度

Java爬虫技术简介 Java爬虫技术是指使用Java语言编写的程序,模拟浏览器行为,自动化地从互联网上获取信息。随着技术的发展,Java爬虫技术已经非常成熟,有多种框架和库可以使用,如Jsoup、HttpClient、WebMagic等。 1688…

LSTM-Transformer时间序列预测(单输入单预测)——基于Pytorch框架

1 介绍 在本篇文章中,将介绍如何使用Transformer和LSTM模型进行时间序列预测。这两种模型分别擅长处理序列数据和捕捉时间序列中的长短期依赖关系。我们将结合这两种模型的优势,构建一个强大的预测模型。单输入单输出预测,适合风电预测&…

与C++类和对象的宿命(下)

本文 1.取地址运算符重载const成员函数取地址成员函数的重载 2. 再探构造函数3. 类型转换1. 隐式类型转换注意事项: 2. 显式类型转换2.1 static_cast2.2 dynamic_cast2.3 const_cast2.4 reinterpret_cast 3. C风格类型转换4. 类型转换操作符5. 注意事项6. 总结 4.st…

MySQL 绪论

数据库相关概念 数据库(DB):存储数据的仓库数据库管理系统(DBMS):操纵和管理数据库的大型软件SQL:操纵关系型数据库的编程语言,定义了一套操作关系型数据库的统一标准主流的关系型数…

域渗透之: 域渗透环境搭建详解基于VMware

域控环境介绍 在域架构中,最核心的就是域控主机,域控主机分为三种: 普通域控额外域控只读域控 域控环境相关知识点介绍 创建域环境首先就是要创建域控主机。域控主机创建完成以后,需要把所有的计算机拉入域中,这样就形成了域控…

权威认证:中国信通院表彰上海斯歌信创成就!

颁奖现场:左二为上海斯歌业务副总裁陈娅香 2024年9月24日-25日,由中国通信标准化协会主办、中国信息通信研究院(简称“中国信通院”)承办、中国通信企业协会支持的“2024数字化转型发展大会”在北京召开。本届大会以“拥抱数智化无…

Network - Telnet协议

Telnet 是一种网络协议,允许用户使用基于文本的界面通过网络与远程设备通信。它在早期的网络应用中被广泛用于远程管理和故障诊断,使用户能够连接到远程机器和服务,通常是通过 TCP/IP 网络。 Telnet is a network protocol that allows a use…

Python使用nuitka进行打包简易教程(终极教程以后只用它打包了)

目录 专栏导读库的介绍(优点)使用nuitka --help可查看所有命令库的安装1、虚拟环境安装2、在打包时候缺少某些组件,会提示你是否安装,输入是(第3步有截图)个人喜好,可以加上 icon参数 3、开始打包4、打包完成查看大小总结 专栏导读 &#x1f…

Linux TFTP服务器搭建

话得多说 先水一波字 TFTP(Trivial File Transfer Protocol)是一种简单的文件传输协议。它用于在计算机网络中传输文件,特别适用于在网络设备(如开发板和Linux系统下)代码调试等操作。TFTP使用UDP(User Da…

春季台球行业招商和宣传大会,2025郑州台球展会3月举办

3月招商季,壹肆柒2025郑州台球展助力企业开拓全国台球消费市场; 2025中国(郑州)国际台球产业博览会(壹肆柒台球展) The 2025 China (Zhengzhou) International Billiards Industry Expo 开展时间&#xf…

[OS] 再探 kernel_threads-1

Linux内核线程(kernel threads)是运行在内核空间的线程,它们不拥有独立的地址空间,因此不能访问用户空间,但可以访问内核空间的数据结构。内核线程通常用于执行一些需要并行处理的任务,例如文件系统的任务、…

升维定位在开源AI智能名片2+1链动模式S2B2C商城小程序中的应用与价值

摘要:本文探讨了升维定位理论在开源AI智能名片21链动模式S2B2C商城小程序中的应用。阐述了升维定位对于创新型产品和创业阶段企业的适用性,分析开源AI智能名片21链动模式S2B2C商城小程序如何利用升维定位创造新的需求市场、成为新市场领导者,…

【Linux】自主shell编写

如果学习了常见的Linux命令,exec*函数,环境变量,那你就可以尝试一下写一个简单的shell; 下面跟着我的步骤来吧!!🤩🤩 输入命令行 既然要写一个shell,我们第一步先把这个输入命令行…

定制化的新生代 Layer1 代币经济学

原文标题:《Next-Gen Layer 1 Tokenomics: Three Pillars for the Token Flywheel》 撰文:Eren,Four Pillars 编译:Tia,Techub News Layer1 代币经济学的转变 最近获得大量关注和大量投资的项目(如 Berac…

避免误修改:如何在Word中锁定指定内容?

在工作中,保护Word文档的某些部分免于被他人修改是一项常见需求。无论是分享给同事、客户,还是用作正式的合同文件,都需要确保关键内容不被随意更改。今天我们一起来看看,如何在Word文档中锁定部分内容,使其无法编辑修…