【QT入门】Qt自定义控件与样式设计之鼠标相对、绝对位置、窗口位置、控件位置

往期回顾

【QT入门】 Qt自定义控件与样式设计之QSlider用法及qss-CSDN博客

【QT入门】Qt自定义控件与样式设计之qss的加载方式-CSDN博客

【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件-CSDN博客

【QT入门】Qt自定义控件与样式设计之鼠标相对、绝对位置、窗口位置、控件位置

这里我们主要是需要明确Qt的坐标系组成,熟悉相关相对绝对函数即可。

一、鼠标位置基本概念

1、桌面原点(0, 0)

桌面原点(0, 0),在桌面左上角。

2、应用程序原点(0,0)

应用程序原点(0,0),在应用程序左上角。

一般都是x向左为正, y向下为正

3、绝对位置

相对于电脑桌面左上角的位置,也就是相对于桌面原点的位置

4、相对位置

相对于应用程序左上角的位置,也就是相对于应用程序原点的位置

二、鼠标、控件、应用程序窗口的位置函数

1、鼠标的位置

1.1●QCursor:pos()

该函数返回值为鼠标相对于桌面左上角的绝对位置

当我们重写mousePressEvent这个方法时:

1.2●mousePressEvent的参数event的位置

(1)event-> pos()的返回值为鼠标相对于应用程序的位置

(2)event- > globalPos()返回值为相对于桌面原点的位置,绝对位置。(跟QCursor:pos()结果是一样的)

2、控件的位置

2.1QPoint p = ui.pushButton-> pos();

返回值为相对位置,也就是按钮控件相对于应用窗口原点的位置

2.2QPoint p = ui.pushButton-> mapToGlobal(QPoint(0, 0));

返回值为绝对位置,也就是按钮相对于桌面原点的绝对位置

2.3QRect rect. = ui.pushButton-rect();

这个函数的返回值为控件的大小。

3、应用程序窗口的位置

3.1QRect rect = m_pDIg-> geometry();

返回值为绝对位置,也就是对话框相对于桌面坐标原点的rect。

3.2QRect rect= m_pDIg-> pos();

返回值为相对位置。

3.3QRect rect = m_pDlg-> rect);

返回值为应用窗口的大小

三、示例

我们通过调用这一系列方法,实现点击鼠标时控制台打印输出对应被点击位置的坐标。

1、最终效果

2、完整实现代码

复制代码
void Widget::mousePressEvent(QMouseEvent *event)
{
    qDebug() << QCursor::pos();  //鼠标绝对位置,相对于桌面左上角的位置

    //鼠标相对于应用程序的位置,相对位置
    qDebug() << "event->pos()         " << event->pos();
    //鼠标相对于桌面原点的位置,绝对位置
    qDebug() << "event->globalPos()   " << event->globalPos();
}

void Widget::on_pushButton_clicked()
{
    //按钮控件相对于应用窗口原点的位置
    qDebug() << u8"控件相对位置" << ui->pushButton->pos();

    //按钮相对于桌面原点的绝对位置
    QPoint jPos = ui->pushButton->mapToGlobal(QPoint(0,0));
    qDebug() << u8"控件绝对位置" << jPos;

    //控件的大小,长*宽的大小
    QRect rect = ui->pushButton->rect();
    qDebug() << rect;

    //窗口相对于桌面坐标原点的位置
    qDebug() << u8"窗口绝对位置" << this->geometry();  // 绝对位置
    
    //窗口的大小,长*宽的大小
    qDebug() << u8"窗口矩形" << this->rect();

    //TempDialog *dlg = new TempDialog(this);
    std::unique_ptr<TempDialog> dlg(new TempDialog(this));
    
    //如何让弹出的对话框位置在按钮左边对齐
    dlg->move(jPos.x() - dlg->width(), jPos.y());

    dlg->exec();
}

注意:

这里用了一个智能指针 ,这个要说一下,由于我们是自己创建了一个TempDialog类,如果不用智能指针,那么关闭窗口后他是不会自动销毁的,就会造成内存泄漏

当然如果创建的时候指定了this,那么后面关闭对话框时不会析构,但是关闭窗口时就会把对话框一起析构掉,也不会出现内存泄漏问题。

推荐还是用智能指针,就不用考虑内存泄漏的问题了。


以上,就是鼠标、控件、应用程序的位置简单介绍

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

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

相关推荐
quikai198130 分钟前
python练习第三组
开发语言·python
JIngJaneIL1 小时前
基于Java非遗传承文化管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot
吃西瓜的年年1 小时前
1. 初识C语言
c语言·开发语言
CHANG_THE_WORLD2 小时前
Python 字符串全面解析
开发语言·python
不会c嘎嘎2 小时前
深入理解 C++ 异常机制:从原理到工程实践
开发语言·c++
永远都不秃头的程序员(互关)2 小时前
C语言 基本语法
c语言·开发语言
永远都不秃头的程序员(互关)3 小时前
Java核心技术精要:高效实践指南
java·开发语言·性能优化
是Dream呀3 小时前
Python圣诞特辑:打造一棵会唱歌、会下雪的魔法圣诞树
开发语言·python·pygame
未来之窗软件服务3 小时前
幽冥大陆(四十一)美萍V10酒店门锁SDK C#语言仙盟插件——东方仙盟筑基期
开发语言·c#·仙盟创梦ide·东方仙盟·东方仙盟sdk·酒店智能门锁·东方仙盟 vos 智能浏览器
freedom_1024_4 小时前
红黑树底层原理拆解
开发语言·数据结构·b树