【二十五】【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号坐标。

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

结尾

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

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

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

相关推荐
一个没有本领的人35 分钟前
win11+matlab2021a配置C-COT
c语言·开发语言·matlab·目标跟踪
一只自律的鸡1 小时前
C项目 天天酷跑(下篇)
c语言·开发语言
源码哥_博纳软云1 小时前
JAVA智慧养老养老护理帮忙代办陪诊陪护小程序APP源码
java·开发语言·微信小程序·小程序·微信公众平台
沐泽Mu1 小时前
嵌入式学习-QT-Day05
开发语言·c++·qt·学习
小板凳-BGM1 小时前
C# 第二阶段 modbus
开发语言·ui·c#
问道飞鱼1 小时前
【Python知识】Python进阶-什么是装饰器?
开发语言·python·装饰器
长安——归故李1 小时前
【C语言】成绩等级制
c语言·开发语言
黄金小码农1 小时前
c# 2024/12/25 周三
开发语言·c#
忒可君2 小时前
C# winform 报错:类型“System.Int32”的对象无法转换为类型“System.Int16”。
java·开发语言
GuYue.bing2 小时前
网络下载ts流媒体
开发语言·python