[Q学习]11 Qt事件系统——过滤事件
来源:互联网 发布:unity3d序列帧动画 编辑:程序博客网 时间:2024/05/20 00:49
>原创文章,可以转载,转载时请以超链接形式保留本文地址、作者信息和本声明。否则将追究法律责任。
我们可能会遇到这样一种需求——监测某个对象的事件投递过程,分析或者拦截某个事件,这时我们就要用到事件过滤器了。什么是事件过滤器呢?事件过滤器本质上是QObject子类的一个对象,该对象重载了eventFilter接口。
如果使用事件过滤器呢?
1 定义QObject子类A,重载eventFilter接口,在这个接口中实现过滤功能;
2 被观察者必须是QObject或者QObject子类的对象,调用QObject::installEventFilter()传入A的对象,即可完成A对该对象的监测;
3 过滤器比事件实际接受者要早一步得到事件。
假设有一个类CInspectA 用于截获事件,当截获事件时输出字符串提示,代码调用过程如下:
监测者类声明:
#ifndef CINSPECT_H#define CINSPECT_H#include <QObject>class CInspectA : public QObject{ Q_OBJECTpublic: explicit CInspectA(QObject *parent = 0);signals:public slots:protected: virtual bool eventFilter(QObject *obj, QEvent *event);};#endif // CINSPECT_H实现#include "cinspect.h"#include <QDebug>CInspectA::CInspectA(QObject *parent) : QObject(parent){}bool CInspectA::eventFilter(QObject *obj, QEvent *event){qDebug() << "inspect :" << obj->objectName() << ", event id = " << event->type(); return true;}
客户端调用
#include <QCoreApplication>#include <QWidget>#include "cinspect.h"int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); // 投递事件 CInspectA I; QObject A; A.setObjectName("A"); // 监测A事件 A.installEventFilter(&I); QEvent E(QEvent::MouseButtonPress); A.event(&E); return a.exec();}
预期结果是输出inspect : "A" , event id = XXXXXX,但是运行之后,发现没有任何输出。为什么呢?原因在于“A.event(&E);”这个调用说明A已经开始处理事件了,这时事件过滤器不会起作用。这里涉及到一个概念:发送(send)和投递(delivery)。发送事件是有对象A发送到对象B,这是一个用户调用的过程;投递是Qt框架沿着接收者的继承关系找到最终处理接口的过程。
为了使过滤器生效,我要们“发送”事件,而不是“投递”事件,修改一下main函数:
#include <QCoreApplication>#include <QWidget>#include "cinspect.h"int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); // 投递事件 CInspectA I; QObject A; A.setObjectName("A"); // 监测A事件 A.installEventFilter(&I); QEvent E(QEvent::MouseButtonPress); QCoreApplication::postEvent(&A, &E); return a.exec();}
此处改用QCoreApplication::postEvent发送事件,运行之后输出:inspect : "A" , event id = QEvent::Type(MouseButtonPress)。
下一篇,我们将讲述事件发送的过程。
0 0
- [Q学习]11 Qt事件系统——过滤事件
- [Q学习]9 Qt事件系统——投递事件
- [Q学习]10 Qt事件系统——处理事件
- [Q学习]12 Qt事件系统——发送事件
- Qt 事件与事件过滤
- Qt 事件与事件过滤
- Qt 事件与事件过滤
- Qt: 事件过滤
- Qt事件过滤
- <Qt+Linux>事件过滤
- Qt事件过滤
- Qt事件过滤
- 【QT】事件过滤
- Qt学习笔记:事件系统
- Qt事件与常用事件处理、过滤
- 自学QT之事件过滤
- Qt学习笔记——事件处理
- Qt 事件系统
- 博客数破100记录
- 数据库存储I/O类型分析与配置
- ASP.Net请求处理机制初步探索之旅 - Part 3 管道
- Leetcode FlattenBinaryTree Java Python
- Leetcode自我做题总结汇总(持续更新)
- [Q学习]11 Qt事件系统——过滤事件
- 跳跃的游戏 计蒜客 ------ACM随笔
- ASP.Net请求处理机制初步探索之旅 - Part 4 WebForm页面生命周期
- [leetcode]33. Search in Rotated Sorted Array
- 在GitHub上建立自己在线简历
- ASP.Net请求处理机制初步探索之旅 - Part 5 ASP.Net MVC请求处理流程
- Java千百问_08JDK详解(009)_java程序如何运行
- Fragment 使用解析
- github常用命令