MouseMoveEvent(鼠标移动事件)
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 设置窗口为无边框,去掉标题栏等装饰
this->setWindowFlag(Qt::FramelessWindowHint);
// 开启鼠标跟踪模式,这样即使不按下鼠标键,鼠标移动事件也会触发
this->setMouseTracking(true);
}
Widget::~Widget()
{
delete ui;
}
// 处理鼠标移动事件
void Widget::mouseMoveEvent(QMouseEvent *event) {
// 使 QLabel 跟随鼠标移动,将鼠标位置设置为 QLabel 的中心
ui->label->move(event->x() - ui->label->width() / 2, event->y() - ui->label->height() / 2);
// 如果鼠标左键按下,拖动整个窗口
if (event->buttons() == Qt::LeftButton) {
// 将窗口移动到鼠标全局位置减去初始的相对位移
this->move(event->globalPos() - temp);
}
// 如果鼠标右键按下,关闭窗口
else if (event->buttons() == Qt::RightButton) {
this->close(); // 关闭窗口
}
}
// 处理鼠标按下事件
void Widget::mousePressEvent(QMouseEvent *event) {
// 记录鼠标按下时,鼠标全局位置与窗口左上角位置的差值,用于实现拖动效果
temp = event->globalPos() - this->pos();
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QMouseEvent> // 包含用于鼠标事件处理的头文件
#include<QPoint> // 包含 QPoint 类,用于表示点的位置
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
// 定义 Widget 类,继承自 QWidget
class Widget : public QWidget
{
Q_OBJECT // 宏,启用 Qt 的信号与槽机制
public:
// 构造函数,初始化父类 QWidget
Widget(QWidget *parent = nullptr);
// 析构函数,释放资源
~Widget();
// 用于存储鼠标按下时的全局位置与窗口左上角位置的差值,用于窗口拖动
QPoint temp;
// 重写鼠标移动事件处理函数,用于处理鼠标移动时的逻辑
void mouseMoveEvent(QMouseEvent *event) override;
// 重写鼠标按下事件处理函数,用于处理鼠标按下时的逻辑
void mousePressEvent(QMouseEvent *event) override;
private:
// 指向 UI 界面的指针,管理界面控件
Ui::Widget *ui;
};
#endif // WIDGET_H