1、事件过滤器用于拦截传递到目标对象的事件,这样可以实现监视目标对象事件的作用
2、实现事件过滤器的步骤:
1、Qt 调用void QObject::installEventFilter (QObject* filterObj)把 filterObj 对象设置安装 ( 或注册 ) 为事件过滤器, filterObj 也称为过滤器对象。事件过滤器通常在构造函数中进行注册。2、在上一步注册的 filterObj 对象,通过调用bool QObject:: eventFilter (QObject* obj, QEvent* e);来接收拦截到的事件。也就是说拦截到的事件在 filterObj 对象中的 eventFilter 函数中处理。 eventFilter 的第一个参数 obj 指向的是事件本应传递到的目标对象。3、使用 QObject::removeEventFilter(QObject *obj) 函数可以删除事件过滤器。
3、 事件过滤器处理事件的规则
①、过滤器对象的 eventFilter()函数可以接受或拒绝拦截到的事件,若该函数返回 false, 则表示事件需要作进一步处理,此时事件会被发送到目标对象本身进行处理(注意: 这里并未向父对象进行传递),若 evetnFilter()返回 true,则表示停止处理该事件,此 时目标对象和后面安装的事件过滤器就无法获得该事件。
②、若同一对象安装了多个事件过滤器,则最后安装的过滤器首先被激活。
4、理解事件过滤器
观察者模式:其原理为,设有一目标对象 W,它有多个观察该对象的对象 G1 , G2 ,G3, 当 W发生变化时,W的观察者会依情形改变自身。应用于 Qt 事件过滤器,则是,首先使 用 W的成员函数 installEventFilter 函数把 G1 , G2 , G3 设置为 W 的观察者,所有本应传递 给 W的事件 E,则先传递给观察者 G1 , G2 , G3 ,然后观察者调用其成员函数 eventFilter 对传递进来的事件进行处理,若 eventFilter 返回 true 表示事件处理完毕,返回 false 则返 回给被观察者 W 进行处理。见下图。