Qt项目捕捉鼠标事件1

因为项目上需要鼠标移动事件,但是直接上手好多问题,只能从头开始啦。

照例说一下我的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);
}

最后说一下,为什么要加鼠标追踪,

  1. 鼠标移动追踪:默认情况下,mouseMoveEvent 仅在鼠标按下时触发。若需鼠标未按下时也响应移动,需调用 setMouseTracking(true)

常用鼠标事件函数(平时用不到的可以不重写):

函数名作用
mousePressEvent鼠标按下时触发
mouseReleaseEvent鼠标松开时触发
mouseMoveEvent鼠标移动时触发(需开启追踪)
mouseDoubleClickEvent鼠标双击时触发
wheelEvent鼠标滚轮滚动时触发

效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值