目录
事件的传递大致流程如上图所示,事件发生,经过一系列函数,来到QAppliction::notify(),然后经过事件过滤器QObject::eventFilter(),经过QObject::event()发送给各个对象,各个对象在调用自己相应的事件处理函数。
在大多数情况下,想要对事件做自己的处理,都从上图框选出来的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
- #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按钮去处理。
本篇博客描述了QT事件的大致流程和走向,也说明通过安装事件过滤器来处理函数,并给出了具体的例子和代码详细说明!下一篇继续总结通过重写事件处理函数,来处理相应事件!
加油!