Qt事件处理机制(一)事件过滤器的使用

目录

1.事件传递大致流程图:

2.安装事件过滤器步骤及相应例子。

3.结语


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事件的大致流程和走向,也说明通过安装事件过滤器来处理函数,并给出了具体的例子和代码详细说明!下一篇继续总结通过重写事件处理函数,来处理相应事件!
加油!

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值