在 Qt 中,可以通过在自定义的类中重载 mousePressEvent 和 mouseMoveEvent 函数来捕获鼠标按下和移动事件,以便实现例如拖动窗口等功能。
mousePressEvent 和 mouseMoveEvent分别是鼠标按下事件和鼠标移动事件。这两个函数是QT中本身就存在的函数,我们对这两个函数进行重写实现拖动无边窗窗口的效果。
重写两个函数完成拖动窗口的功能
代码
#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)
这个函数捕获鼠标按下事件,记录当前窗口的位置和鼠标的位置,以及它们之间的差值。
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)
这个函数捕获鼠标移动事件,并通过拖动鼠标移动窗口。
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号坐标。
坐标的实际含义是向量,带箭头的线段。
结尾
最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。
同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。
谢谢您的支持,期待与您在下一篇文章中再次相遇!