【QT随笔】事件过滤器(installEventFilter 和 eventFilter 的组合)之生命周期管理详解
上一章节中提到事件过滤器(Event Filter),用于处理特定事件。其中第二小节中提到了事件过滤器生命周期管理。本文将详细解析事件过滤器生命周期管理这一部分的内容。
(关注不迷路哈!!!)
文章目录
前言
生命周期三个阶段总览
-
- 初始化阶段
- 初始化阶段
-
- 运行阶段
-
- 清理阶段
一、初始化阶段
- 创建过滤器对象:过滤器必须是
QObject
的子类,建议设置父对象实现自动内存管理 - 安装到目标控件:通过
installEventFilter()
方法注册,过滤器被添加到目标控件的过滤器链表头部 - 建立事件连接:建立从Qt事件系统到过滤器的连接通道,事件将首先经过过滤器处理
1. 创建过滤器对象
// 方式1:直接创建(需手动管理内存)
MyEventFilter* filter = new MyEventFilter();
// 风险:需要手动delete,容易导致内存泄漏
// 方式2:设置父对象(推荐,自动内存管理)
MyEventFilter* filter = new MyEventFilter(targetWidget);
// targetWidget删除时自动删除filter
// 方式3:使用智能指针
std::unique_ptr<MyEventFilter> filter =
std::make_unique<MyEventFilter>();
关键要点:
- 过滤器必须继承自
QObject
- 建议设置父对象实现自动内存管理
- 可以在堆栈或堆上创建
2. 安装到目标控件
// 安装事件过滤器
targetWidget->installEventFilter(filter);
// 安装多个过滤器(按安装顺序逆序执行)
targetWidget->installEventFilter(filter1); // 最后执行
targetWidget->installEventFilter(filter2); // 其次执行
targetWidget->installEventFilter(filter3); // 最先执行
执行顺序原理:
3. 建立事件连接
内部机制:
- Qt在
QObject
内部维护一个过滤器链表 - 每个事件首先遍历此链表
- 任一过滤器返回
true
则终止事件传递
// Qt内部伪代码实现
bool QObject::event(QEvent *e) {
// 先调用事件过滤器
if (d->filterList) {
for (auto filter