【二十五】【QT开发应用】无边窗窗口鼠标拖动窗口移动,重写mousePressEvent,mouseMoveEvent函数

在 Qt 中,可以通过在自定义的类中重载 mousePressEvent 和 mouseMoveEvent 函数来捕获鼠标按下和移动事件,以便实现例如拖动窗口等功能。

mousePressEvent 和 mouseMoveEvent分别是鼠标按下事件和鼠标移动事件。这两个函数是QT中本身就存在的函数,我们对这两个函数进行重写实现拖动无边窗窗口的效果。

重写两个函数完成拖动窗口的功能

代码

cpp 复制代码
#include "MainWidget.h"
#include <QMoveEvent>

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

    this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMaximizeButtonHint);
}

MainWidget::~MainWidget()
{}

void MainWidget::mousePressEvent(QMouseEvent * event) {
    window_pos = this->pos();
    mouse_pos = event->globalPos();
    diff_pos = mouse_pos - window_pos;

}

void MainWidget::mouseMoveEvent(QMouseEvent* event) {
    QPoint pos = event->globalPos();

    this->move(pos - diff_pos);
}

这段代码实现了一个简单的拖动窗口的功能,通过鼠标按下和移动事件,可以让 MainWidget 这个窗口随鼠标拖动。

1. mousePressEvent(QMouseEvent* event)

这个函数捕获鼠标按下事件,记录当前窗口的位置和鼠标的位置,以及它们之间的差值。

cpp 复制代码
void MainWidget::mousePressEvent(QMouseEvent* event) {
    // 记录窗口的当前位置
    window_pos = this->pos();  // 获取窗口的当前坐标

    // 记录鼠标的全局位置(相对于屏幕)
    mouse_pos = event->globalPos();  // 获取鼠标相对于屏幕的位置

    // 计算鼠标位置和窗口位置之间的差值
    diff_pos = mouse_pos - window_pos;  // 这是当点击窗口时鼠标与窗口左上角之间的差值
}
  • this->pos():获取窗口的当前位置(相对于屏幕的左上角)。
  • event->globalPos():获取鼠标在屏幕上的位置(相对于屏幕的左上角)。
  • diff_pos:计算鼠标位置和窗口左上角之间的差值,用于保持窗口的相对移动。
2. mouseMoveEvent(QMouseEvent* event)

这个函数捕获鼠标移动事件,并通过拖动鼠标移动窗口。

cpp 复制代码
void MainWidget::mouseMoveEvent(QMouseEvent* event) {
    // 获取鼠标的全局位置(相对于屏幕)
    QPoint pos = event->globalPos();  // 获取当前鼠标相对于屏幕的位置

    // 移动窗口,保持鼠标与窗口之间的相对位置不变
    this->move(pos - diff_pos);  // 将窗口移动到新位置
}
  • event->globalPos():获取鼠标当前位置(相对于屏幕的全局坐标)。
  • this->move(pos - diff_pos):通过新的鼠标位置和之前计算的差值来计算窗口的新位置,并移动窗口。

功能总结:

  • 当鼠标按下时,记录当前窗口位置和鼠标位置,并计算它们之间的相对偏移量 diff_pos
  • 当鼠标移动时,根据鼠标的新位置和偏移量 diff_pos,实时更新窗口的位置,从而实现窗口的拖动。

使用场景:

  • 这个功能常用于无边框窗口 (Qt::FramelessWindowHint),允许用户通过点击并拖动窗口的内容区域来移动整个窗口。

代码解析

this->pos()表示以整个桌面的左上角为坐标原点,当前窗口左上角的矢量向量,即窗口坐标。
event->globalPos()表示以整个桌面的左上角为坐标原点,当前鼠标的矢量向量,即鼠标坐标。
this->move()表示将窗口左上角设置为怎样的坐标,同样是以整个桌面的左上角为坐标原点。

5号坐标是鼠标移动之后的坐标,我们可以直接通过event->globalPos()获取。

我们需要得到6号坐标,这样我们就可以直接设置鼠标移动之后的窗口位置,即this->move(6号坐标)

6号坐标怎么得到?五号坐标减去4号坐标,4号坐标等价于3号坐标。

坐标的实际含义是向量,带箭头的线段。

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

相关推荐
码界奇点1 分钟前
Java外功核心7深入源码拆解Spring Bean作用域生命周期与自动装配
java·开发语言·spring·dba·源代码管理
零小陈上(shouhou6668889)10 分钟前
YOLOv8+PyQt5输电线路缺陷检测(目前最全面的类别检测,可以从图像、视频和摄像头三种路径检测)
python·qt·yolo
老华带你飞13 分钟前
考试管理系统|基于java+ vue考试管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
2501_9216494915 分钟前
股票 API 对接,接入美国纳斯达克交易所(Nasdaq)实现缠论回测
开发语言·后端·python·websocket·金融
程序喵大人16 分钟前
constexpr
开发语言·c++·constexpr
Larry_Yanan18 分钟前
Qt多进程(五)QUdpSocket
开发语言·c++·qt·学习·ui
Grassto23 分钟前
从 GOPATH 到 Go Module:Go 依赖管理机制的演进
开发语言·后端·golang·go
懒惰蜗牛27 分钟前
Day66 | 深入理解Java反射前,先搞清楚类加载机制
java·开发语言·jvm·链接·类加载机制·初始化
hudawei99634 分钟前
flutter路由传参接收时机
开发语言·flutter·异步
38242782735 分钟前
python:Ajax爬取电影详情实战
开发语言·python·ajax