• 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文件

    1. #pragma once
    2. #include
    3. #include "ui_QPeoplePro.h"
    4. class QPeoplePro : public QWidget
    5. {
    6. Q_OBJECT
    7. public:
    8. QPeoplePro(QWidget *parent = nullptr);
    9. ~QPeoplePro();
    10. void InitUi();
    11. protected:
    12. bool eventFilter(QObject* watched, QEvent* event);
    13. private:
    14. void ProcessDogPress();
    15. void ProcessDogRelease();
    16. private:
    17. Ui::QPeopleProClass ui;
    18. };

    QPeoplePro.cpp文件

    1. #include "QPeoplePro.h"
    2. QPeoplePro::QPeoplePro(QWidget *parent)
    3. : QWidget(parent)
    4. {
    5. ui.setupUi(this);
    6. InitUi();
    7. }
    8. QPeoplePro::~QPeoplePro()
    9. {
    10. }
    11. void QPeoplePro::InitUi()
    12. {
    13. ui.m_pBtnDog->installEventFilter(this);
    14. }
    15. bool QPeoplePro::eventFilter(QObject* watched, QEvent* event)
    16. {
    17. if (event->type() == QEvent::MouseButtonPress)
    18. {
    19. ProcessDogPress(); //调用处理鼠标按下的函数
    20. return true;
    21. }
    22. else if (event->type() == QEvent::MouseButtonRelease)
    23. {
    24. ProcessDogRelease(); //调用处理鼠标松开的函数
    25. return true;
    26. }
    27. return QWidget::eventFilter(watched, event);
    28. }
    29. void QPeoplePro::ProcessDogPress()
    30. {
    31. ui.m_pBtnDog->move(ui.m_pBtnDog->x() + 2, ui.m_pBtnDog->y() + 2);
    32. }
    33. void QPeoplePro::ProcessDogRelease()
    34. {
    35. ui.m_pBtnDog->move(ui.m_pBtnDog->x() + 1, ui.m_pBtnDog->y() + 1);
    36. }

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

  • 相关阅读:
    iDEA - Gradle构建多module项目踩坑指南
    《斯坦福数据挖掘教程·第三版》读书笔记(英文版) Chapter 2 MapReduce and the New Software Stack
    Abp vNext 依赖注入
    信创操作系统--麒麟Kylin桌面操作系统 (项目十二 使用Systemd管理系统服务)
    java计算机毕业设计华北地区阔叶林木叶部病虫害图像管理系统源码+mysql数据库+系统+lw文档+部署
    css 文字溢出问题
    【ZeloEngine】OpenGL升级Vulkan
    Virtual File System了解
    iOS 开发中上传 IPA 文件的方法(无需 Mac 电脑)
    通过重新构建Kubernetes来实现更具弹性的容器编排系统
  • 原文地址:https://blog.csdn.net/qq_40876689/article/details/126473927