当前位置: 首页 > news >正文

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

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

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

(关注不迷路哈!!!)

文章目录

  • 【QT随笔】事件过滤器(installEventFilter 和 eventFilter 的组合)之生命周期管理详解
    • 前言
    • 一、初始化阶段
      • 1. 创建过滤器对象
      • 2. 安装到目标控件
      • 3. 建立事件连接
    • 二、运行阶段
      • 1. 事件监控
      • 2. 事件处理
      • 3. 事件传递
    • 三、清理阶段
      • 1. 移除过滤器
      • 2. 释放资源
      • 3. 断开连接
    • 四、事件过滤器完整生命周期示例
    • 总结


前言

生命周期三个阶段总览

    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 
http://www.xdnf.cn/news/1441153.html

相关文章:

  • 卷积神经网络CNN-part2-简单的CNN
  • 深度学习篇---InceptionNet
  • 深度学习——卷积神经网络
  • 服务器搭建日记(十二):创建专用用户通过 Navicat 远程连接 MySQL
  • Mac电脑Tomcat+Java项目中 代码更新但8080端口内容没有更新
  • 最新KeyShot 2025安装包下载及详细安装教程
  • leetcode210.课程表II
  • STM32F103按钮实验
  • Redis基础篇
  • 新后端漏洞(上)- Redis 4.x5.x 未授权访问漏洞
  • COB封装固晶载具/IC芯片固晶载具核心功能与核心要求
  • 《明朝那些事》读书笔记-王阳明:「知行合一」
  • Prometheus 配置主机宕机告警
  • 同城跑腿系统 跑腿小程序app java源码 跑腿软件项目运营
  • 存算一体:重构AI计算的革命性技术(2)
  • “互联网 +”时代商业生态变革:以开源 AI 智能名片链动 2+1 模式 S2B2C 商城小程序为例
  • 小程序点击之数据绑定
  • 深度学习三大框架对比评测:PaddlePaddle、PyTorch 与 TensorFlow
  • 从零开始的python学习——列表
  • OpenCV的阈值处理
  • 华为云Stack Deploy安装(VMware workstation物理部署)
  • LabVIEW信号频谱分析与限测系统
  • 190页经典PPT | 某科技集团数字化转型SAP解决方案
  • 开源 + 免费!谷歌推出 Gemini CLI,Claude Code 的强劲对手
  • Java设计模式之结构型—代理模式
  • leetcode算法刷题的第二十五天
  • Python:AI开发第一语言的全面剖析
  • Springboot3+SpringSecurity6Oauth2+vue3前后端分离认证授权-客户端
  • 【机器学习入门】5.4 线性回归模型的应用——从CO₂浓度预测学透实战全流程
  • 远程的 develop 比你本地的 develop 更新,Git 拒绝直接覆盖