Qt 中所有事件类都继承于QEvent。在事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)
用户如果使用该事件? 由于事件函数是virtual 必须用户实现
如果重写QLabel事件 需要在自定义的label控件中实现 事件的重写
在mylabel.h中修改如下:
#ifndef MYLABEL_H
#define MYLABEL_H
#include
//MyLabel 继承于 QLabel 就可以在MyLabel类中 重写 QLabel的事件
class MyLabel : public QLabel
{
Q_OBJECT
public:
explicit MyLabel(QWidget *parent = 0);
signals:
public slots:
};
#endif // MYLABEL_H
#include "mylabel.h"
MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
}
提升label的类型 为MyLabel
总结:如果想重写 某个类的事件 一般情况 就要自定义一个类 继承于该控件的类型
然后将控件的类 提升成 自定义的类 这样我们就可以在自定义类中 重写控件类型事件函数
事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的事件处理器(event handler)。
event()函数主要用于事件的分发
如果你希望在事件分发之前做一些操作,就可以重写这个event()函数了。
1、如果传入的事件已被识别并且处理,则需要返回 true,否则返回 false。如果返回值是 true,那么 Qt 会认为这个事件已经处理完毕,不会再将这个事件发送给其它对象,而是会继续处理事件队列中的下一事件。
2、在event()函数中,调用事件对象的accept()和ignore()函数是没有作用的,不会影响到事件的传播。
3、记得不关心的事件 记得用父类的事件分发器处理。
virtual bool event(QEvent *e)
mylabel.h声明重写事件分发器
mylabel.cpp 重写事件分发器
通过前面的章节,我们已经知道,Qt 创建了QEvent事件对象之后,会调用QObject的event()函数处理事件的分发。显然,我们可以在event()函数中实现拦截的操作。由于event()函数是 protected 的,因此,需要继承已有类。如果组件很多,就需要重写很多个event()函数。这当然相当麻烦,更不用说重写event()函数还得小心一堆问题。好在 Qt 提供了另外一种机制来达到这一目的:事件过滤器
不想让它继续转发,就返回 true,否则返回 false
在QObject类中Public Functions找到:
在mylabel.h中声明 事件过滤器函数
在mylabel.cpp中实现 事件过滤器函数
运行结果:
1、这种全局的事件过滤器将会在所有其它特性对象的事件过滤器之前调用。尽管很强大,但这种行为会严重降低整个应用程序的事件分发效率。
2、事件过滤器和被安装过滤器的组件必须在同一线程,否则,过滤器将不起作用。另外,如果在安装过滤器之后,这两个组件到了不同的线程,那么,只有等到二者重新回到同一线程的时候过滤器才会有效。