Qt事件处理机制二重写事件处理函数:重写鼠标移动事件,实现用鼠标拖动按钮在widget中自由移动!

前言

首先给出上一篇博客Qt事件处理机制(一)安装事件过滤器的地址:https://blog.csdn.net/qq_40876689/article/details/126473927?spm=1001.2014.3001.5502
上篇博客总结了Qt事件处理机制常用的有2种方法,并记录了第一种方法安装事件过滤器的具体使用步骤及详细的代码。本篇博客记录一下第二种方法,重写事件处理函数的使用步骤以及相应代码。

重写事件处理函数的步骤

1.创建一个新的类,并继承自某一个Qt的类,该类中有你想要重写的事件处理函数。
2.直接在新创建的类中重写相应的处理函数。
此处就不详细说明了, 在下一步代码实例中进行举例说明。

具体示例和代码详解

1.效果图

重写鼠标事件实现鼠标拖动按钮移动

本示例想要自己处理按钮的鼠标按下事件、鼠标松开事件、鼠标移动事件,就需要创建一个类继承自QPushButton,然后重写QPushButton的三个事件处理函数,分别是:

  • mousePressEvent(QMouseEvent*e)
  • mouseRleaseEvent(QMouseEvent*e)
  • mouseMoveEvent(QMouseEvent*e)

QBtnDog.h文件

#pragma once
#include <QPushButton>
#include "ui_QBtnDog.h"

class CQBtnDog : public QPushButton
{
	Q_OBJECT

public:
	CQBtnDog(QWidget*parent = nullptr);
	~CQBtnDog();
protected:
	void mousePressEvent(QMouseEvent*);
	void mouseReleaseEvent(QMouseEvent*);
	void mouseMoveEvent(QMouseEvent*);
private:
	Ui::CQBtnDogClass ui;
	bool m_pPressed;
	QPoint m_pPointPress;
};

QBtnDog.cpp文件

#include "QBtnDog.h"
#include <QMouseEvent>

CQBtnDog::CQBtnDog(QWidget*parent)
	: QPushButton(parent)
	, m_pPressed(false)
{
	ui.setupUi(this);
}
CQBtnDog::~CQBtnDog()
{}

void CQBtnDog::mousePressEvent(QMouseEvent* event)
{
	m_pPressed = true;
	m_pPointPress = QCursor::pos();       //记录鼠标按下时的坐标
}

void CQBtnDog::mouseReleaseEvent(QMouseEvent* event)
{
	m_pPressed = false;
}

void CQBtnDog::mouseMoveEvent(QMouseEvent* event)
{
	if (m_pPressed)
	{
		QPoint newPoint = QCursor::pos();	//记录鼠标移动最新的鼠标坐标
		float xDis = newPoint.x() - m_pPointPress.x();				//计算移动后和按下时的坐标差x
		float yDis = newPoint.y() - m_pPointPress.y();				//计算移动后和按下时的坐标差y
		this->move(this->pos().x() + xDis, this->pos().y()+yDis);	//让自定义按钮的位置加上坐标差,并移动至加上移动距离之后的位置
		m_pPointPress = QCursor::pos();		//更新按下时的坐标为当前坐标位置
	}
}

新创建的类,继承了QPushButton,重写了QPushButton的鼠标按下、松开、移动事件处理函数,所以当鼠标在该按钮有相应的操作时,会执行重写的处理函数。
在鼠标按下事件处理函数中,m_pPressed = true;用于标记鼠标是否按下状态,并记录下当前鼠标的位置。
鼠标松开事件处理函数中,m_pPressed = false;表示鼠标已松开。
鼠标移动事件处理函数中,先获取移动后的鼠标坐标,用移动后的鼠标坐标减去刚刚按下时的鼠标坐标,得到一个移动距离,然后移动当前窗口位置,也就是示例图中的newBtn按钮,将它的位置加上移动距离,就是移动后的位置;最后在更新一下记录最新鼠标坐标的变量;至此,鼠标放在自定义按钮上,按下之后,进行移动,自定义的按钮也会进行移动。

常见的Qt事件类型及相应的事件处理函数

  1. 键盘事件: 按键按下和松开
  2. 鼠标事件: 鼠标移动,鼠标按键的按下和松开
  3. 拖放事件: 用鼠标进行拖放
  4. 滚轮事件: 鼠标滚轮滚动
  5. 绘屏事件: 重绘屏幕的某些部分
  6. 定时事件: 定时器到时
  7. 焦点事件: 键盘焦点移动
  8. 进入和离开事件: 鼠标移入widget之内,或是移出
  9. 移动事件: widget的位置改变
  10. 大小改变事件: widget的大小改变
  11. 显示和隐藏事件: widget显示和隐藏
  12. 窗口事件: 窗口是否为当前窗口
事件类型名称 对应的事件处理函数
键盘按下 keyPressEvent(QKeyEvnet* event)
键盘松开 keyReleaseEvent(QKeyEvnet* event)
鼠标按下 mousePressEvent(QMouseEvent* event)
鼠标松开 mouseReleaseEvent(QMouseEvent* event)
鼠标移动 mouseMoveEvent(QMouseEvent* event)
鼠标双击事件 mouseDoubleClickEvent(QMouseEvent* event)
鼠标滚轮事件 wheelEvent(QWheelEvent* event)
重绘事件 paintEvent(QPaintEvent* event)
大小改变事件 resizeEvent(QResizeEvent* event)
移动事件 moveEvent(QMoveEvent* event)
进入事件 enterEvent(QEvent* event)
离开事件 leaveEvent(QEvent* event)
显示事件 showEvent(QShowEvent* event)
隐藏事件 hideEvent(QHideEvent* event)

总结

本片博客主要记录重写事件处理函数的方法,例子中也展示了如何通过重写按钮鼠标移动事件,拖动按钮在widget中自由移动。
兄弟加油!一起变强!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340