目录
1.事件传递大致流程图:
事件的传递大致流程如上图所示,事件发生,经过一系列函数,来到QAppliction::notify(),然后经过事件过滤器QObject::eventFilter(),经过QObject::event()发送给各个对象,各个对象在调用自己相应的事件处理函数。
在大多数情况下,想要对事件做自己的处理,都从上图框选出来的2个部分下手,第一个是安装事件过滤器,第二个就是自定义一个类,继承某个对象,然后重写该对象的事件处理函数。今天先说一下安装过滤器步骤和例子。
2.安装事件过滤器步骤及相应例子。
1.调用void QObject::installEventFilter(QObject *filterObj)这个函数;
2.重写bool QObject::eventFilter(QObject *watched, QEvent *event)函数。
(函数的具体含义和参数会在后面的例子中结合代码进行详细说明)。
举个例子:People要过滤Dog的事件:
Dog->installEventFilter(People);
然后在People这个类里面重写eventFilter()函数,People就可以在eventFilter()这个函数里面处理Dog身上发生的事件了。
上代码实现以下这个过程:
创建一个People的widget,里面放一个Dog的按钮,如图:
QPeoplePro.h文件
#pragma once
#include <QtWidgets/QWidget>
#include "ui_QPeoplePro.h"
class QPeoplePro : public QWidget
{
Q_OBJECT
public:
QPeoplePro(QWidget *parent = nullptr);
~QPeoplePro();
void InitUi();
protected:
bool eventFilter(QObject* watched, QEvent* event);
private:
void ProcessDogPress();
void ProcessDogRelease();
private:
Ui::QPeopleProClass ui;
};
QPeoplePro.cpp文件
#include "QPeoplePro.h"
QPeoplePro::QPeoplePro(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
InitUi();
}
QPeoplePro::~QPeoplePro()
{
}
void QPeoplePro::InitUi()
{
ui.m_pBtnDog->installEventFilter(this);
}
bool QPeoplePro::eventFilter(QObject* watched, QEvent* event)
{
if (event->type() == QEvent::MouseButtonPress)
{
ProcessDogPress(); //调用处理鼠标按下的函数
return true;
}
else if (event->type() == QEvent::MouseButtonRelease)
{
ProcessDogRelease(); //调用处理鼠标松开的函数
return true;
}
return QWidget::eventFilter(watched, event);
}
void QPeoplePro::ProcessDogPress()
{
ui.m_pBtnDog->move(ui.m_pBtnDog->x() + 2, ui.m_pBtnDog->y() + 2);
}
void QPeoplePro::ProcessDogRelease()
{
ui.m_pBtnDog->move(ui.m_pBtnDog->x() + 1, ui.m_pBtnDog->y() + 1);
}
本例子中,在InitUi()函数中,ui.m_pBtnDog->installEventFilter(this); 给按钮m_pBtnDog安装了一个事件过滤器,参数是this,也就是当前的QPeople这个类,也就是说QPeople这个类现在可以监控m_pBtnDog的所有事件了!
在QPeople类中又重新实现了虚函数eventFilter(QObject* watched, QEvent* event),其中参数1,watched指的就是m_pBtnDog按钮,参数2则是m_pBtnDog按钮所触发的事件。
在函数中,如果检测到是鼠标按下事件或鼠标送开,就执行相应的处理函数,然后直接返回true,返回true就意味着,该事件过滤成功,不会在分发给m_pBtnDog按钮去处理啦!如果是其他事件,就返回QWidget::eventFilter(watched, event);它会把我们没有处理的事件继续传递给m_pBtnDog按钮去处理。
3.结语
本篇博客描述了QT事件的大致流程和走向,也说明通过安装事件过滤器来处理函数,并给出了具体的例子和代码详细说明!下一篇继续总结通过重写事件处理函数,来处理相应事件!
加油!