当前位置: 首页 > 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.dtcms.com/a/364399.html

相关文章:

  • 微信小程序wx.getLocation结合腾讯地图逆解析获取位置详细教程,定位授权完整流程
  • 【Qt】国际化(中英文翻译)——Qt语言家(Linguist)和QTranslator类的简单使用(内含完整源码)
  • el-tree 点击父节点无效,只能选中子节点
  • 存算一体:重构AI计算的革命性技术(3)
  • 2025 大数据时代值得考的证书排名前八​
  • 电子病历空缺句的语言学特征描述与自动分类探析(以GPT-5为例)(上)
  • 分布式AI算力系统番外篇-----超体的现实《星核》
  • 2025版基于springboot的电影购票管理系统
  • Linux_网络基础
  • Uniapp中进行微信小程序头像和昵称的更改
  • Jenkins 可观测最佳实践
  • Flutter Android真机器调式,虚拟机调试以及在Vscode中开发Flutter应用
  • 【Linux操作系统】简学深悟启示录:进程控制
  • unity中的交互控制脚本
  • 如何选择适合企业的海外智能客服系统:6 大核心维度 + 实战选型指南
  • 【STL源码剖析】从源码看 deque :拆解双端队列的底层实现与核心逻辑
  • 用友T3、T6/U8批量作废凭证
  • 从数据生成到不确定性估计:用 LSTM + 贝叶斯优化实现时间序列多步预测
  • 基于SpringBoot的旅游管理系统
  • 【大前端】React 使用 Redux 实现组件通信的 Demo 示例
  • React实现点击按钮复制操作【navigator.clipboard与document.execCommand】
  • 基于单片机PWM信号发生器系统Proteus仿真(含全部资料)
  • 平衡车 - 电机调速
  • 基于单片机车内换气温度检测空气质量检测系统Proteus仿真(含全部资料)
  • 单片机点灯
  • Linux 网络编程中核心函数`recv`。
  • zynq 开发系列 新手入门:GPIO 连接 MIO 控制 LED 闪烁(SDK 端代码编写详解)
  • Spring Boot 实现数据库表变更监听的 Redis 消息队列方案
  • 单片机控制两只直流电机正反转C语言
  • 变频器实习DAY42 VF与IF电机启动方式