【Qt】网格布局管理器QGridLayout

news2024/11/16 1:33:25

 网格布局管理器QGridLayout

Qt中提供QGridLayout用来实现网格布局的效果。

  • 核心属性

整体和 QVBoxLayout 以及 QHBoxLayout 相似. 但是设置 spacing 的时候是按照垂直⽔平两个

⽅向来设置的.

属性说明

layoutLeftMargin

左侧边距

layoutRightMargin

右侧边距

layoutTopMargin

上⽅边距

layoutBottomMargin

下⽅边距

layoutHorizontalSpacing

相邻元素之间⽔平⽅向的间距

layoutVerticalSpacing

相邻元素之间垂直⽅向的间距

layoutRowStretch

⾏⽅向的拉伸系数

layoutColumnStretch

列⽅向的拉伸系数

例子:使用QGridLayout管理控件

(1)创建四个按钮,一个QGridLayout

(2)设置一个2 * 2的按钮布局

(3)模仿垂直布局管理器

(4)模仿水平布局管理器

(5)任意调整⾏列, 即可看到不同的效果

(6)调整任意数值

 

即使设置的值非常大,也不会在中间留出大量空间,此处设置的行数与列数只是用来决定控件之间的相对位置。

例子:设置QGridLayout中元素的大小比例

之前创建的布局管理器,里面的控件尺寸都是均等的。

当需要创建出尺寸不同的控件的时候,就可以通过拉伸系数来设置,拉伸系数就相当于控件之间尺寸的“比例”

(1)设置6个按钮,通过网格布局管理器设置成 2 * 3的排列方式

(2)使⽤ setColumnStretch 设置每⼀列的拉伸系数 

此处代码的含义就是这三个列是按照 1:1:2的方式来设置宽度

 

如果拉伸系数设为0,即不参与拉伸,其按钮的尺寸为固定值,不会进行动态变化。

(3)代码展示

#include "widget.h"
#include "ui_widget.h"

#include <QPushButton>
#include <QGridLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 创建 6 个按钮
    QPushButton* button1 = new QPushButton("按钮1");
    QPushButton* button2 = new QPushButton("按钮2");
    QPushButton* button3 = new QPushButton("按钮3");
    QPushButton* button4 = new QPushButton("按钮4");
    QPushButton* button5 = new QPushButton("按钮5");
    QPushButton* button6 = new QPushButton("按钮6");

    // 设置网布布局管理器
    QGridLayout* layout = new QGridLayout();
    this->setLayout(layout);

    // 将按钮以 2 * 3的布局方式放入布局管理器中
    layout->addWidget(button1, 0, 0);
    layout->addWidget(button2, 0, 1);
    layout->addWidget(button3, 0, 2);
    layout->addWidget(button4, 1, 0);
    layout->addWidget(button5, 1, 1);
    layout->addWidget(button6, 1, 2);

    // 设置拉伸系数
//    layout->setColumnStretch(0, 1);
//    layout->setColumnStretch(1, 1);
//    layout->setColumnStretch(2, 2);

    // 设置存在 0 拉伸系数
    layout->setColumnStretch(0, 0);
    layout->setColumnStretch(1, 1);
    layout->setColumnStretch(2, 1);

}

Widget::~Widget()
{
    delete ui;
}

  • 另外, QGridLayout 也提供了 setRowStretch 设置⾏之间的拉伸系数 

例子: 设置垂直方向的拉伸系数

(1)创建 6 个按钮,使用布局管理器设置成 3 * 2 的排列方式

(2)使用setRowStretch设置行的拉伸系数

上述代码,直接与上例进行设置拉伸系数,发现是没有效果的。

这里之所以没有拉伸,是因为SizePolicy起到的影响。这是QWidget的属性

使⽤ setSizePolicy 设置按钮的尺⼨策略. 可选的值如下:

  • QSizePolicy::Ignored : 忽略控件的尺⼨,不对布局产⽣影响。

  • QSizePolicy::Minimum : 控件的最⼩尺⼨为固定值,布局时不会超过该值

  • QSizePolicy::Maximum : 控件的最⼤尺⼨为固定值,布局时不会⼩于该值。

  • QSizePolicy::Preferred : 控件的理想尺⼨为固定值,布局时会尽量接近该值。

  • QSizePolicy::Expanding : 控件的尺⼨可以根据空间调整,尽可能占据更多空间。

  • QSizePolicy::Shrinking : 控件的尺⼨可以根据空间调整,尽可能缩⼩以适应空间。

由于按钮垂直方向默认没有拉伸开,而水平方式是拉伸的。因此垂直方式不会受到拉伸系数的影响。要想让垂直方向的拉伸系数生效,就需要让按钮先能够拉伸展开。

(3)代码实现

#include "widget.h"
#include "ui_widget.h"

#include <QPushButton>
#include <QGridLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 设置 6 个按钮
    QPushButton* button1 = new QPushButton("按钮1");
    QPushButton* button2 = new QPushButton("按钮2");
    QPushButton* button3 = new QPushButton("按钮3");
    QPushButton* button4 = new QPushButton("按钮4");
    QPushButton* button5 = new QPushButton("按钮5");
    QPushButton* button6 = new QPushButton("按钮6");

    // 设置网格布局管理器
    QGridLayout* layout = new QGridLayout();

    // 设置按钮的 sizePolicy, 此时按钮的⽔平⽅向和垂直⽅向都会尽量舒展开
    button1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    button2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    button3->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    button4->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    button5->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    button6->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

    // 将按钮设置到布局管理其中
    layout->addWidget(button1, 0, 0);
    layout->addWidget(button2, 0, 1);
    layout->addWidget(button3, 1, 0);
    layout->addWidget(button4, 1, 1);
    layout->addWidget(button5, 2, 0);
    layout->addWidget(button6, 2, 1);

    // 设置行的拉伸系数
    layout->setRowStretch(0, 1);
    layout->setRowStretch(1, 1);
    layout->setRowStretch(2, 2);


    // 将布局管理器设置到窗口
    this->setLayout(layout);

}

Widget::~Widget()
{
    delete ui;
}

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

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

相关文章

类与Object.create之间的继承

前言 ● 下面是一段之前学习Object.create的一段代码 const PersonProto {calcAge() {console.log(2037 - this.birthYear);},init(firstName, birthYear) {this.firstName firstName;this.birthYear birthYear;} };const zhangsan Object.create(PersonProto); ● 和之前…

day-43 括号生成

思路 通过深度优先遍历&#xff0c;把所有可能的组合枚举出来&#xff0c;然后依次判断是否符合括号规则&#xff0c;符合则加入链表 解题过程 判断是否括号规则&#xff1a;第一个位置只能是(&#xff0c;维护一个val值(初始值为0)&#xff0c;遍历字符串&#xff0c;每当加入…

深度强化学习算法(四)(附带MATLAB程序)

深度强化学习&#xff08;Deep Reinforcement Learning, DRL&#xff09;结合了深度学习和强化学习的优点&#xff0c;能够处理具有高维状态和动作空间的复杂任务。它的核心思想是利用深度神经网络来逼近强化学习中的策略函数和价值函数&#xff0c;从而提高学习能力和决策效率…

【项目日记】高并发内存池---实现线程缓存

比起那些用大嗓门企图压制世界的人&#xff0c; 让全世界都安静下来听你小声说话的人更可畏。 --- 韩寒 《告白与告别》--- 高并发内存池项目---实现线程缓存 1 框架设计2 自由链表类和哈希规则2.1 自由链表类2.2 映射规则 3 实现线程缓存3.1 申请内存3.2 释放内存 4 多线程…

day-43 盛最多水的容器

思路 双指针&#xff1a;首先令i0,jheight.length-1,选取短板&#xff08;即Math.min(height[i],height[j])&#xff09;,然后将短板向内移动&#xff0c;直达i>j即可得到答案。 解题过程 短板向内移动&#xff1a;水的容量可能增大 长板向内移动&#xff1a;水的容量不可能…

树莓派5安装系统并配置SSH与VNC权限实现Windows设备远程连接

文章目录 前言1. 使用 Raspberry Pi Imager 安装 Raspberry Pi OS2. Windows安装VNC远程树莓派3. 使用VNC Viewer公网远程访问树莓派3.1 安装Cpolar步骤3.2 配置固定的公网地址3.3 VNC远程连接测试 4. 固定远程连接公网地址4.1 固定TCP地址测试 前言 本文主要介绍如何在树莓派…

数字化转型升级探索(一)

在数字化转型升级的探索中&#xff0c;我们将通过实施综合数字化战略&#xff0c;涵盖从前端用户体验优化到后端系统集成的全方位提升&#xff0c;利用大数据、人工智能、云计算等先进技术对业务流程进行智能化改造&#xff0c;推进自动化和数据驱动决策&#xff0c;推动业务模…

VMware安装Ubuntu 23.10.1系统图文版

文章目录 Ubuntu系统介绍引言Ubuntu系统的特点1. 开源免费2. 易用性3. 稳定性与安全性4. 强大的社区支持 安装与初步设置下载ISO镜像安装1.新建虚拟机2.选择“自定义(高级)”&#xff0c;并点击【下一步】3.选择虚拟机硬件兼容性(默认就好)&#xff0c;并点击【下一步】4.选择“…

爆改yolov8|利用BSAM改进YOLOv8,高效涨点

1&#xff0c;本文介绍 BSAM基于CBAM进行改进&#xff0c;经实测在多个数据集上都有涨点。 BSAM&#xff08;BiLevel Spatial Attention Module&#xff09;是一个用于提升深度学习模型在空间特征处理中的能力的模块。它主要通过双层注意力机制来增强模型对重要空间信息的关注…

一款支持固定区域,固定尺寸大小重复截图的软件

WinSnap是一款功能强大的屏幕截图软件&#xff0c;可以实现对固定区域&#xff0c;固定尺寸大小区域重复截图&#xff0c;适用于日常截图需求和专业用户进行屏幕截图和图像编辑。通过设置快捷键&#xff0c;方便快速重复截图固定区域固定大小。它支持捕捉整个屏幕、活动窗口、选…

H264码流结构讲解

所谓的码流结构就是指&#xff1a;视频经过编码之后所得到的数据是怎样排列的&#xff0c;换句话说&#xff0c;就是编码后的码流我们该如何将一帧一帧的数据分离开来&#xff0c;哪一块数据是一帧图像&#xff0c;哪一块是另外一帧图像&#xff0c;只要了解了这个&#xff0c;…

UE开发中的设计模式(四) —— 组合模式

面试中被面试官问到组合模式和继承有什么区别&#xff0c;给我问懵了&#xff0c;今天又仔细看了下&#xff0c;这不就是UE里的组件吗 >_< 文章目录 问题提出概述问题解决总结组合模式的优缺点继承的优缺点 问题提出 考虑这样一个场景&#xff0c;我们有一个敌人的基类&…

【读书笔记-《30天自制操作系统》-10】Day11

本篇内容继续围绕显示展开。首先对鼠标显示做了些优化&#xff0c;鼠标箭头在到达画面边缘时能够实现部分隐藏&#xff1b;接下来制作了窗口&#xff0c;实现了窗口显示&#xff1b;最后还在窗口的基础上实现了计数器&#xff0c;显示计数的变化并消除闪烁的问题。 1. 画面边…

Java 6.3 - 定时任务

为什么需要定时任务&#xff1f; 常见业务场景&#xff1a; 1、支付10min失效 2、某系统凌晨进行数据备份 3、视频网站定时发布视频 4、媒体聚合平台每10min抓取某网站数据为己用 …… 这些场景需要我们在某个特定时间去做某些事情。 单机定时任务技术有哪些&#xff1f…

form-data和x-www-form-urlencoded的区别

form-data和x-www-form-urlencoded区别 form-data 和 x-www-form-urlencoded 都是表单请求的一种格式&#xff0c;主要区别有两点。 编码方式不同 我们先说x-www-form-urlencoded&#xff0c;它的编码方式就隐藏在名字里&#xff1a;urlencoded。看到这个关键词&#xff0c;…

Gradle下载失败或者慢怎么办

在Android Studio开发过程中&#xff0c;经常需要下载Gradle构建工具来构建项目。然而&#xff0c;由于网络限制或国际镜像服务器响应慢&#xff0c;Gradle的下载过程可能会非常缓慢甚至失败。为了优化这一过程&#xff0c;我们可以采用国内的Gradle镜像来加速下载。同时&#…

期权的交易时间是什么时候?期权具体交易时间分享!

今天带你了解期权的交易时间是什么时候&#xff1f;期权具体交易时间分享&#xff01;期权交易时间与股票市场同步&#xff0c;每个交易日的上午9:15至11:30和下午13:00至15:00为主要的交易时间。 50ETF期权交易时间 1.50ETF期权交割日&#xff1a; 固定的规则&#xff1a; …

FLUX 1 将像 Stable Diffusion 一样完整支持ControlNet组件

之前 InstantX 团队做的多合一的 Flux ControlNet 现在开始和 ShakkerAI 合作并推出了&#xff1a;Shakker-Labs/FLUX.1-dev-ControlNet-Union-Pro 该模型支持 7 种控制模式&#xff0c;包括 canny (0), tile (1), depth (2), blur (3), pose (4), gray (5) 和 low quality (6)…

Priority_Queue 的使用和模拟

目录 一基本的介绍 优先队列是一种容器适配器&#xff1b;他的第一个元素总是他包含所有元素里面最大的一个。 他的底层容器可以是任何标准容器类模板&#xff0c;也可以是其他特定设计的容器类。 这个底层容器应该可以通过随机访问迭 代器&#xff0c;并支持以下操作&#x…