1.事件和信号槽虽然功能相似但是不是一个东西,事件是QObject的枚举,更倾向于组件通用,信号槽则更有针对性,每个组件有不同的信号
2.事件过滤器是在事件响应前面加了一道过滤网,可以在这道过滤网中预处理,处理完后可以继续放过去继续处理,也可以不再处理,与返回值相关
3.事件过滤器只需要继承QObject类,只需要重写bool eventFilter(QObject *watched, QEvent *event)即可成为一个事件过滤器
4.事件过滤器的QEvent *event是输入的事件的基类,可以通过dynamic_cast转换以获得更多可执行方法
5.需要进行过滤的对象需要调用
void installEventFilter(QObject *filterObj);
方法就能绑定到事件过滤器,事件发生时先进入过滤器操作
接下来展示事件过滤器的使用方法,写一个拦截键盘输入的程序
1.新建继承QObject类filter,重写事件过滤器函数
bool eventFilter(QObject *watched, QEvent *event) override;
//参数为发生事件的对象类型和发生的事件
识别事件发生是否是输入栏,是否是按键按下,如果是按键按下则打印到调试框
widget中添加一个输入栏,创建过滤器对象调用其方法installEventFilter将对象添加到事件过滤器
执行,在输入框输入数据
可以看到输入框并没有数据,因为我们打印按键后返回的是true,代表事件已处理完成,不需要调用组件默认的事件处理。如果改为返回false
因为返回了false,系统判断未处理,所以输入栏执行了输入栏默认的事件处理函数