【Qt】QWidget的geometry属性

news2024/11/15 11:14:21

geometry,意思是“几何”。可以将geometry视为是四个属性的统称。

x:横坐标

y:纵坐标

width:宽度

height:高度

API说明

geometry()

获取到控件的位置和尺⼨. 返回结果是⼀个 QRect, 包含了 x, y, width, height. 其中 x, y 是左上⻆的坐标

setGeometry(QRect)

setGeometry(int x, int y,int width, int height)

设置控件的位置和尺⼨. 可以直接设置⼀个 QRect, 也可以分四个属性单独设置

Rect就是“矩形”。

在Qt中针对一些几何上的概念也进行了封装。例如QPoint表示一个点,QRect表示一个矩形,这些都是属于小对象,里面的属性非常少,占用空间也小。这种小对象在C++中进行使用的时候,通常会按照值的方式来传递参数。

move只是修改位置,二setGeometry既可以修改位置,又可以修改尺寸。

例子一:使用上下左右按钮移动位置 

下面进行实际演示:

首先要注意的是,修改这些属性的时候,一定要先确认好你当前选中的是哪个控件。

设置四个按钮,分别更改名称up,left,right,down,并修改其objectName,期望通过点击这几个按钮,就能够修改target按钮的geometry。

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

#include<QDebug>

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

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


void Widget::on_pushButton_target_clicked()
{
    QRect rect = ui->pushButton_target->geometry();
    qDebug() << rect;
}

void Widget::on_pushButton_up_clicked()
{
    //获取target自身的geometry
    QRect rect = ui->pushButton_target->geometry();
    rect.setY(rect.y() - 1);
    ui->pushButton_target->setGeometry(rect);
}

void Widget::on_pushButton_down_clicked()
{
    QRect rect = ui->pushButton_target->geometry();
    rect.setY(rect.y() + 1);
    ui->pushButton_target->setGeometry(rect);
}


void Widget::on_pushButton_left_clicked()
{
    QRect rect = ui->pushButton_target->geometry();
    rect.setX(rect.x() - 1);
    ui->pushButton_target->setGeometry(rect);
}


void Widget::on_pushButton_right_clicked()
{
    QRect rect = ui->pushButton_target->geometry();
    rect.setX(rect.x() + 1);
    ui->pushButton_target->setGeometry(rect);
}

在当前代码执行的过程中,实际执行的效果是在调整左上角的位置,而左上角位置改变的同时,高度和宽度也发生了改变。

        如果只想让按钮进行平移,即其高度宽度不变,整个按钮的位置发生变化?

刚才的代码,修改的是QRect对象的x和y,这样的修改就会使QRect宽度和高度发生改变。此时不需要再修改QRect,而是通过QRect基于serGeometry第二个函数重新设置位置即可。

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

#include<QDebug>

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

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


void Widget::on_pushButton_target_clicked()
{
    QRect rect = ui->pushButton_target->geometry();
    qDebug() << rect;
}

void Widget::on_pushButton_up_clicked()
{
    //获取target自身的geometry
    QRect rect = ui->pushButton_target->geometry();
//    rect.setY(rect.y() - 1);
//    ui->pushButton_target->setGeometry(rect);
    ui->pushButton_target->setGeometry(rect.x(), rect.y() - 1, rect.width(), rect.height());
}

void Widget::on_pushButton_down_clicked()
{
    QRect rect = ui->pushButton_target->geometry();
//    rect.setY(rect.y() + 1);
//    ui->pushButton_target->setGeometry(rect);
    ui->pushButton_target->setGeometry(rect.x(), rect.y() + 1, rect.width(), rect.height());
}


void Widget::on_pushButton_left_clicked()
{
    QRect rect = ui->pushButton_target->geometry();
//    rect.setX(rect.x() - 1);
//    ui->pushButton_target->setGeometry(rect);
    ui->pushButton_target->setGeometry(rect.x() - 1, rect.y(), rect.width(), rect.height());
}


void Widget::on_pushButton_right_clicked()
{
    QRect rect = ui->pushButton_target->geometry();
//    rect.setX(rect.x() + 1);
//    ui->pushButton_target->setGeometry(rect);
    ui->pushButton_target->setGeometry(rect.x() + 1, rect.y(), rect.width(), rect.height());
}

例子二:表白神器

设置一个label,俩个按钮,需要更改这三个objectName。注意名字需要有一定命名风格。

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //设置随机种子,使用时间戳作为随机种子
    srand(time(0));
}

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


void Widget::on_pushButton_accept_clicked()
{
    //表白成功,送喜欢的人小花花
    ui->label_like->setText("             送你一朵小花花!");
}


void Widget::on_pushButton_reject_clicked()
{
    //点击拒绝,挪走按钮

    //首先获取到窗口的尺寸
    int width = this->geometry().width();
    int height = this->geometry().height();
    //生成随机数
    int x = rand() % (width - ui->pushButton_reject->geometry().width());
    int y = rand() % (height - ui->pushButton_reject->geometry().height());
    //根据随机数移动按钮位置
    ui->pushButton_reject->move(x, y);
}

rand()是C标准库中的函数,能够生成一个随机的整数,这个数字的范围很大。rand函数之前需要时间戳设置随机种子。在C语言中通过time可以获取到秒级时间戳(以1970年1月1日0时0分0秒为基准计算当前时刻和基准时刻的秒数/毫秒数/微秒数 之差)。

这种方式是根据点击按钮来提供信号的,但是按钮提供的信号不止有点击(一下一上),可以不使用clicked信号,换成pressed,当鼠标按下的时候触发。

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //设置随机种子,使用时间戳作为随机种子
    srand(time(0));
}

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


void Widget::on_pushButton_accept_clicked()
{
    //表白成功,送喜欢的人小花花
    ui->label_like->setText("             送你一朵小花花!");
}


void Widget::on_pushButton_reject_clicked()
{
    //不使用
}

void Widget::on_pushButton_reject_pressed()
{
    //点击拒绝,挪走按钮

    //首先获取到窗口的尺寸
    int width = this->geometry().width();
    int height = this->geometry().height();
    //生成随机数
    int x = rand() % (width - ui->pushButton_reject->geometry().width());
    int y = rand() % (height - ui->pushButton_reject->geometry().height());
    //根据随机数移动按钮位置
    ui->pushButton_reject->move(x, y);
}

此时就变得更快了。

WindowsFrame的影响

Windows Frame窗口框架,这是系统自带的。

如果Widget作为一个窗口(带有标题栏,最小化,最大化,关闭按钮),那么在计算尺寸和坐标的时候就存在俩种算法,包含Window Frame和不包含Window frame。

在Qt中,关于位置尺寸,提供了很多的API:

有的API的位置信息是以Widget本体左上角为原点的(不考虑Window frame)

有的API的位置信息是以window frame左上角为原点的。

上述geometry()、setGeometry()都是不考虑window frame的。

Qt中还提供了frameGeometry()和setFrameGeometry(),这是需要考虑window frame的。

API说明

x()

获取横坐标

计算时包含 window frame

y()

获取纵坐标

计算时包含 window frame

pos()

返回 QPoint 对象, ⾥⾯包含 x(), y(), setX(), setY() 等⽅法.

计算时包含 window frame

frameSize()

返回 QSize 对象, ⾥⾯包含 width(), height(), setWidth(), setHeight() 等⽅法.

计算时包含 window frame

frameGeometry()

返回 QRect 对象. QRect 相当于 QPoint 和 QSize 的结合体. 可以获取 x, y,width, size.

计算时包含 window frame 对象.

///

width()

获取宽度

计算时不包含 window frame

height()

获取⾼度

计算时不包含 window frame

size()

返回 QSize 对象, ⾥⾯包含 width(), height(), setWidth(), setHeight() 等⽅法.

计算时不包含 window frame

rect()

返回 QRect 对象. QRect 相当于 QPoint 和 QSize 的结合体. 可以获取并设置 x,y, width, size.

计算时不包含 window frame 对象.

geometry()

返回 QRect 对象. QRect 相当于 QPoint 和 QSize 的结合体. 可以获取 x, y,width, size.

计算时不包含 window frame 对象

setGeometry()

直接设置窗⼝的位置和尺⼨. 可以设置 x, y, width, height, 或者 QRect 对象.

计算时不包含 window frame 对象

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

#include<QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    //针对widget对象来使用geometry和frameGeometry观察现象
    QRect rect1 = this->geometry();
    QRect rect2 = this->frameGeometry();
    qDebug() << rect1;
    qDebug() << rect2;
}

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

使用此代码运行程序的时候,发现此时的位置是相同的,这是因为当前代码是放到了构造函数中,此时这个Widget对象正在构造,还没有被加入到对象。

因此此时还看不到window frame的影响。

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

#include<QDebug>
#include<QPushButton>

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

    QPushButton* button = new QPushButton(this);
    button->setText("按钮");
    button->move(350,250);
    connect(button, &QPushButton::clicked, this, &Widget::handleButton);
}

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

void Widget::handleButton()
{
    //针对widget对象来使用geometry和frameGeometry观察现象
    QRect rect1 = this->geometry();
    QRect rect2 = this->frameGeometry();
    qDebug() << rect1;
    qDebug() << rect2;
}

所以,在点击按钮时, 打印的 geometry 和 frameGeometry 是存在差异的。

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

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

相关文章

jar包扫描不到,idea如何通过Project Structure设置

目录 一、进入Project Structure二、添加你的项目进来三、手动添加依赖 很多时候jar包文件已经存在&#xff0c;但是无法使用&#xff0c;需要通过Project Structure设置 一、进入Project Structure 选择Modules->点击 二、添加你的项目进来 一直next&#xff0c;最后点…

论文阅读笔记:ST-MetaNet-2

目录 预备知识 定义1&#xff1a;城市交通 定义2&#xff1a;Geo-graph属性 问题1 方法 RNN 元学习器 元图注意力网络 元循环神经网络 预备知识 在本节中&#xff0c;我们介绍定义和问题陈述。为简洁起见&#xff0c;我们在表1中提供了一个注释表。 假设有个位置&…

Java - API

API全称"Application Programming Interface"&#xff0c;指应用程序编程接口 API&#xff08;JDK17.0&#xff09;链接如下 : Overview (Java SE 17 & JDK 17) (oracle.com)https://docs.oracle.com/en/java/javase/17/docs/api/中文版&#xff1a; Java17中…

C++内存泄露检测-Windows平台VLD

一、安装Visual Leak Detector 下载地址&#xff1a;https://kinddragon.github.io/vld/ 安装过程就一路next即可&#xff0c;如果自定义安装目录的话&#xff0c;需要记住安装的目录&#xff0c;默认目录 C:\Program Files (x86)\Visual Leak Detector&#xff0c;这个目录下…

[独家原创]基于(牛顿拉夫逊)NRBO-TCN多变量回归预测(多输入单输出) Matlab代码

[独家原创]基于(牛顿拉夫逊)NRBO-TCN多变量回归预测(多输入单输出) Matlab代码 NRBO优化的超参数为&#xff1a;卷积核个数、正则化系数、初始化学习率 1.程序已经调试好&#xff0c;无需更改代码替换数据集即可运行&#xff01;&#xff01;&#xff01;数据格式为excel&…

色轮在数据可视化中的应用

在数据可视化中&#xff0c;色彩的运用不仅仅是为了美观&#xff0c;更是为了传达信息、区分数据和提升图表的易读性。本文探讨色轮及其色彩公式的应用&#xff0c;帮助大家更好地运用色彩来提升数据可视化的效果。 1、色轮的基础概念 色轮是一个用于表示颜色之间关系的图形工…

Linux自动构建工具——make/makefile

目录 一、make/makefile是什么&#xff1f; 二、深入了解 1.基本命令 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、make/makefile是什么&#xff1f; 在Linux中make是一条指令&#xff0c;makefile是文件。make的核心功能就是读取一个或者多个…

解决问题:Arcgis10.8“数据“-“导出至CAD“时就卡死了

问题现象&#xff1a;我们在使用Arcgis10.8软件&#xff0c;执行 “数据导出至CAD”操作时&#xff0c;会出现卡死的情况&#xff0c;步骤如下图所示&#xff1a; 解决方案&#xff1a;在菜单栏依次选择“地理处理”-“地理处理选项”&#xff0c;然后在“后台处理”和“发生错…

黄金市场展望:CPI数据引发关注,技术面看涨

亚市现货黄金行情 8月14日周三&#xff0c;亚市盘中现货黄金价格小幅下跌&#xff0c;目前交投在2462美元/盎司附近。投资者将重点关注即将公布的美国消费者物价指数&#xff08;CPI&#xff09;数据&#xff0c;预计这将对黄金市场产生重大影响。 美联储政策预期与CPI数据 市场…

IIC电路详细设计

下面我们来聊一聊IIC。 首先要知道,为什么IIC需要接上拉电阻?这里就需要承接到上一部分的内容:三极管。 注意到这样一句话:「连接到总线的器件输出级必须是漏极开路或集电极开路才能执行线与的功能 」,这里就涉及到「漏极/集电极开路」、「上拉电阻」和「线与」两个概念…

ReetrantReadWriteLock 读写锁原理

一、为什么要出现读写锁&#xff1f; 我们知道synchronizer 和 ReentrantLock 都是互斥锁 但现实很多业务场景都是读多写少&#xff0c;针对这种场景在并发中若采用 synchronizer 和 ReentrantLock 来保证原子性&#xff0c;但会降低代码的性能。这种场景&#xff0c;就可以…

数据库技术核心:迭代逻辑思考

文章目录 数据库演进史第一阶段&#xff1a;早期文件系统第二阶段&#xff1a;关系数据库&#xff08;RDBMS&#xff09;第三阶段&#xff1a;面向对象数据库&#xff08;OODBMS&#xff09;第四阶段&#xff1a;分布式数据库和 NoSQL 数据库第五阶段&#xff1a;NewSQL 数据库…

广告资料库是什么?如何正确使用Facebook广告资料库?一文解决你的烦恼!

什么是广告资料库 广告营销领域&#xff0c;创意和策略的更新速度极快。为了跟上这种节奏&#xff0c;广告资料库应运而生&#xff0c;成为广告人和营销专家的重要工具。广告资料库是一个集中存储和管理广告素材、创意案例、市场数据和用户反馈的平台。它不仅帮助用户获得灵感…

Redis集群:概念和部署示例

目录 Redis 集群的优点 集群模式 主从模式 缺陷 哨兵模式 缺陷 集群模式&#xff08;Redis Cluster&#xff09; 数据分片原理 添加节点 删除节点 Redis集群的分片方式 故障转移机制 如果Master只有一个Slave 如果Master有多个Slave 如果两个Slave票数一样呢&a…

UE5中动画重定向问题,新角色滑步,双脚不动向前后左右移动

UE5系列文章目录 我们在UE商场或者一些其他渠道的感觉非常好的人物模型和动画&#xff0c;想把他们替换到我们的工程中&#xff0c;或者把小白人替换到&#xff0c;就经常遇到动画重定向 Unreal Engine 5&#xff08;UE5&#xff09;中的动画重定向是一种强大的功能&#xff…

高校体育场管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;状态管理&#xff0c;学生管理&#xff0c;体育场管理&#xff0c;用户订单管理&#xff0c;学生订单&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;…

HTML5+JavaScript绘制彩虹和云朵

HTML5JavaScript绘制彩虹和云朵 彩虹&#xff0c;简称虹&#xff0c;是气象中的一种光学现象&#xff0c;当太阳光照射到半空中的水滴&#xff0c;光线被折射及反射&#xff0c;在天空上形成拱形的七彩光谱&#xff0c;由外圈至内圈呈红、橙、黄、绿、蓝、靛、紫七种颜色。事实…

RabbitMq消息队列(缓存加速)

然后切换yum仓库&#xff1b; 这里采用阿里的仓库&#xff1b; rm -rf /etc/yum.repos.d/* curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo …

Vitis AI 基本认知(CNN基本概念)

目录 1. 目的 2. 概念解释 2.1 计算并行度 2.2 超参数 2.3 反向传播算法 2.4 优化器&#xff08;Optimizer&#xff09; 2.5 评估指标&#xff08;Metrics&#xff09; 2.5.1 准确率、精确率、召回率 2.5.2 F1 Score 2.5.3 IoU 2.6 内存布局 2.6.1 输入 2.6.2 中间…

【eNSP模拟实验】链路聚合-手工负载模式和静态LACP模式

链路聚合介绍 简介 链路聚合&#xff08;英语&#xff1a;Link Aggregation&#xff09;是一个计算机网络术语&#xff0c;指将多个物理端口汇聚在一起&#xff0c;形成一个逻辑端口&#xff0c;以实现出/入流量吞吐量在各成员端口的负荷分担&#xff0c;交换机根据用户配置的…