【QT随笔】事件过滤器(installEventFilter 和 eventFilter 的组合)之生命周期管理详解

发布于:2025-09-04 ⋅ 阅读:(13) ⋅ 点赞:(0)

【QT随笔】事件过滤器(installEventFilter 和 eventFilter 的组合)之生命周期管理详解

上一章节中提到事件过滤器(Event Filter),用于处理特定事件。其中第二小节中提到了事件过滤器生命周期管理。本文将详细解析事件过滤器生命周期管理这一部分的内容。

(关注不迷路哈!!!)


前言

生命周期三个阶段总览

    1. 初始化阶段
      在这里插入图片描述
    1. 运行阶段

在这里插入图片描述

    1. 清理阶段

在这里插入图片描述


一、初始化阶段

  • 创建过滤器对象:过滤器必须是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 

网站公告

今日签到

点亮在社区的每一天
去签到