前言
首先给出上一篇博客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事件类型及相应的事件处理函数
- 键盘事件: 按键按下和松开
- 鼠标事件: 鼠标移动,鼠标按键的按下和松开
- 拖放事件: 用鼠标进行拖放
- 滚轮事件: 鼠标滚轮滚动
- 绘屏事件: 重绘屏幕的某些部分
- 定时事件: 定时器到时
- 焦点事件: 键盘焦点移动
- 进入和离开事件: 鼠标移入widget之内,或是移出
- 移动事件: widget的位置改变
- 大小改变事件: widget的大小改变
- 显示和隐藏事件: widget显示和隐藏
- 窗口事件: 窗口是否为当前窗口
事件类型名称 | 对应的事件处理函数 |
---|---|
键盘按下 | 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中自由移动。
兄弟加油!一起变强!