因为项目上需要鼠标移动事件,但是直接上手好多问题,只能从头开始啦。
照例说一下我的ide配置:
vs2022 + qt 6.83
首先,建立一个空的工程,我们就命名为 : QtMouseEvent
接下来,头文件里面申明鼠标事件的几个函数和几个变量:
private:
Ui::QtMouseEventClass ui;
bool m_isPressed = false; // 标记鼠标是否按下
QPoint m_lastPos; // 记录鼠标按下时的位置(用于移动窗口)
protected:
// 重写鼠标事件虚函数(protected 权限)
void mousePressEvent(QMouseEvent* event) override; // 鼠标按下
void mouseReleaseEvent(QMouseEvent* event) override; // 鼠标松开
void mouseMoveEvent(QMouseEvent* event) override; // 鼠标移动
void mouseDoubleClickEvent(QMouseEvent* event) override; // 鼠标双击
void wheelEvent(QWheelEvent* event) override; // 鼠标滚轮
然后,我们在源文件里面实现这几个函数就可以了(我们主要打点日志,方便观察):
// 鼠标按下事件
void QtMouseEvent::mousePressEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton) // 判断左键按下
{
m_isPressed = true;
m_lastPos = event->globalPosition().toPoint() - this->frameGeometry().topLeft();
qDebug() << "左键按下,位置:" << event->pos(); // 相对窗口的坐标
// event->globalPos():全局屏幕坐标
}
else if (event->button() == Qt::RightButton) // 右键按下
{
qDebug() << "右键按下,位置:" << event->pos();
}
// 必须调用父类事件(可选,根据需求)
QMainWindow::mousePressEvent(event);
}
// 鼠标松开事件
void QtMouseEvent::mouseReleaseEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton)
{
m_isPressed = false;
qDebug() << "左键松开,位置:" << event->pos();
}
QMainWindow::mouseReleaseEvent(event);
}
// 鼠标移动事件
void QtMouseEvent::mouseMoveEvent(QMouseEvent* event)
{
// 如果左键按下,移动窗口
if (m_isPressed && (event->buttons() & Qt::LeftButton))
{
this->move(event->globalPosition().toPoint() - m_lastPos);
qDebug() << "窗口移动中,当前位置:" << this->pos();
}
else
{
qDebug() << "鼠标移动,位置:" << event->pos();
}
QMainWindow::mouseMoveEvent(event);
}
// 鼠标双击事件
void QtMouseEvent::mouseDoubleClickEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton)
{
// 双击最大化/还原窗口
this->setWindowState(this->windowState() == Qt::WindowMaximized ? Qt::WindowNoState : Qt::WindowMaximized);
qDebug() << "左键双击,窗口状态切换";
}
QMainWindow::mouseDoubleClickEvent(event);
}
// 鼠标滚轮事件
void QtMouseEvent::wheelEvent(QWheelEvent* event)
{
// 获取滚轮滚动角度(正值向上,负值向下)
int delta = event->angleDelta().y();
if (delta > 0)
{
qDebug() << "滚轮向上滚动,角度:" << delta;
}
else
{
qDebug() << "滚轮向下滚动,角度:" << delta;
}
QMainWindow::wheelEvent(event);
}
最后,我们在构造函数里面开启鼠标追踪就可以了:
QtMouseEvent::QtMouseEvent(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
// 1、开启鼠标移动追踪(即使鼠标未按下,也能触发mouseMoveEvent)
this->setMouseTracking(true);
// 2. 中央控件(centralWidget)必须开启(QMainWindow 核心!)
this->centralWidget()->setMouseTracking(true);
}
最后说一下,为什么要加鼠标追踪,
-
鼠标移动追踪:默认情况下,
mouseMoveEvent仅在鼠标按下时触发。若需鼠标未按下时也响应移动,需调用setMouseTracking(true)。
常用鼠标事件函数(平时用不到的可以不重写):
| 函数名 | 作用 |
|---|---|
mousePressEvent | 鼠标按下时触发 |
mouseReleaseEvent | 鼠标松开时触发 |
mouseMoveEvent | 鼠标移动时触发(需开启追踪) |
mouseDoubleClickEvent | 鼠标双击时触发 |
wheelEvent | 鼠标滚轮滚动时触发 |
效果:

143

被折叠的 条评论
为什么被折叠?



