【Qt之事件过滤器】使用

news2024/11/29 6:36:36

介绍

事件过滤器是Qt中一种重要的机制,用于拦截并处理窗口和其他对象的事件。
它可以在不修改已有代码的情况下,动态地增加、删除一些处理事件的代码,并能够对特定对象的事件进行拦截和处理。

在Qt中,事件处理经过以下几个阶段:

  1. 事件产生阶段:事件的产生通常是由用户操作引起的,例如点击鼠标、按下键盘等。

  2. 事件分发阶段:在此阶段,事件被发送到目标对象,目标对象可以是一个窗口、一个控件或任何QObject的子类实例。

  3. 事件过滤阶段:在此阶段,事件可以被一个或多个事件过滤器所拦截。如果事件被拦截,它将不再被分发到目标对象。

  4. 事件处理阶段:在此阶段,目标对象接收到事件并执行相应的处理代码。如果对象没有处理事件,它会将事件发送给它的父对象,直到事件被处理或到达应用程序的顶级对象。

  5. 事件传播阶段:在此阶段,事件可能会被传递给其他对象,例如父对象、兄弟对象或应用程序的全局事件过滤器。

  6. 事件回溯阶段:在此阶段,如果事件没有被处理,它会向事件的产生者传递一个未处理的事件通知。

在事件处理的整个过程中,事件对象都是QEvent的子类实例,不同的事件类型对应着不同的处理流程和方法。

事件过滤器通常由两个部分组成,一个是事件过滤器类,另一个是需要进行事件过滤的对象

示例

.h

class MyEventFilter : public QObject
{
    Q_OBJECT
public:
    explicit MyEventFilter(QObject* parent = nullptr) : QObject(parent){}

protected:
    bool eventFilter(QObject* obj, QEvent* event) override
    {
        if (event->type() == QEvent::MouseButtonPress)
        {
            qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << "Mouse press event intercepted by event filter";
            return true;
        }
        return QObject::eventFilter(obj, event);
    }
};

cpp

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QPushButton button("Click me");
    MyEventFilter eventFilter;
    button.installEventFilter(&eventFilter);
    button.show();

    return a.exec();
}

结果

在这里插入图片描述

在示例中,

  • 创建了一个MyEventFilter类,继承自QObject类,并重写了它的eventFilter()函数。
  • 在该函数中,判断拦截的事件类型是否为鼠标按下事件,如果是,就输出一条调试信息,并返回true,表示事件被过滤掉了。如果是其他类型的事件,则将其交给原来的eventFilter()函数进行处理。
  • 创建了一个QPushButton对象,并通过installEventFilter()函数设置了事件过滤器为eventFilter对象,即button对象的事件会先经过eventFilter对象的处理,再由button对象处理。
  • 调用QApplication的exec()函数,启动应用程序。

使用场景

  1. 拦截某个对象的事件:当需要对某个控件的某个事件进行特殊处理时,可以使用事件过滤器来实现。

  2. 监听全局事件:通过将事件过滤器对象安装到QApplication中,可以监控所有窗口和控件的事件。

  3. 监听事件流:通过事件过滤器,可以拦截并记录事件流,以便在需要时进行调试和分析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1172175.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++零散问题总结

什么是析构函数? return 0

图解Linux进程优先级

目录 1.什么是进程优先级&#xff1f; 2.进程优先级原理 3.查看进程优先级 4.修改进程优先级 4.1 setpriority函数原型 4.2 getpriority函数原型 4.3 sched_setscheduler函数原型 4.4 sched_getscheduler函数原型 4.5 sched_setparam函数原型 4.6 sched_getparam函数…

终极秘诀:打破无代码状态的小方法

终极秘诀&#xff1a;打破无代码状态的小方法 大家有没有遇到过不想写代码或学习的时候呢&#xff1f;这种情况下&#xff0c;你们会选择放松还是停下来呢&#xff1f;我很好奇大家是怎么度过这段时间的。我个人的情况是&#xff0c;当我不想写代码或学习的时候&#xff0c;我会…

Python基础入门例程39-NP39 字符串之间的比较(运算符)

最近的博文&#xff1a; Python基础入门例程38-NP38 牛牛的逻辑运算&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程37-NP37 不低于与不超过&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程36-NP36 谁的数字大&#xff08;运算符&#xff09;-CSD…

Hybrid App(原生+H5)开发

介绍 市面上主流的hybrid app框架主要有 React Native&#xff1a;由FaceBook开发&#xff0c;使用JavaScript和React来构建原生应用程序Flutter&#xff1a;由Google开发&#xff0c;使用Dart语言。Flutter使用自己的渲染引擎Ionic&#xff1a;基于 Web 技术&#xff08;HTM…

探索无限可能:APITable免费开源多维表格与可视化数据库远程访问的魅力

APITable免费开源的多维表格与可视化数据库公网远程访问 文章目录 APITable免费开源的多维表格与可视化数据库公网远程访问前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 前言 vika维格表作为新一代数据生产力平台&#xff0c…

【Java初阶练习题】-- 数组练习题

数组练习题 1. 创建的数组&#xff0c;并且赋初始值2. 改变原有数组元素的值3. 数组所有元素之和4. 奇数位于偶数之前5.两数之和6. 只出现一次的数字7. 多数元素8. 给你一个整数数组 arr&#xff0c;请你判断数组中是否存在连续三个元素都是奇数的情况&#xff1a;如果存在&…

Kibana中使用Dev Tools控制台创建索index索引同时添加date类型的时间参数(用于根据时间序列展示数据)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

android studio 字节码查看工具jclasslib bytecode viewer

jclasslib bytecode viewer 是一款非常好用的.class文件查看工具&#xff1b; jclasslib bytecode editor is a tool that visualizes all aspects of compiled Java class files and the contained bytecode. Many aspects of class files can be edited in the UI. In addit…

AD教程(六)现有元件模型的调用

AD教程&#xff08;六&#xff09;现有元件模型的调用 导入现有原理图 Altium Schematic Document (.SchDoc) 直接拖入AD即可 直接用现有原理图生成原理图库 点击设计&#xff0c;选择生成原理图库&#xff0c;进入归类设置界面&#xff08;用原理图直接生成原理图库&#xf…

【漏洞复现】Apache_HTTPD_未知后缀名解析

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 upload-labs/Pass-07 上传1.php文件 <?php eval($_REQUEST[6868]);phpinfo();?>访问/upload/1.php.jaychou 蚁剑连接

(自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载

(自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载 带后台系统PbootCMS内核开发的网站模板&#xff0c;该模板适用于新闻博客网站、自媒体运营网站等企业&#xff0c;当然其他行业也可以做&#xff0c;只需要把文字图片换成其他行业的即可&#…

linux的另一种判断符号【中括号】

由于正在表达式的关系&#xff0c;所以如下 第一、括号内每个组件需要空格分隔 第二、变量最好用双引号 第三、常量最好用单引号或双引号 中括号常用条件判断是 if then fi 为啥发3张图片&#xff0c;因为运行的试试程序报错&#xff0c;说我语法错误“”&#xff0c;可以…

06、三数之和:给你一个整数数组 nums ,请你返回所有和为 0 且不重复的三元组。

文章目录 1、题目描述1.1 移动所有零至数组末尾1.2 示例 2、解题思路2.1 思路讲解2.2 动画演示&#xff08; 待补充&#xff09; 3、答案3.1 Java 代码3.2 运行结果 4、视频讲解&#xff08; 待补充&#xff09; 1、题目描述 1.1 移动所有零至数组末尾 给你一个整数数组 nums…

微服务架构——笔记(2)

微服务架构——笔记&#xff08;2&#xff09; 一、客户客户端模块 文章来源B站视频 尚硅谷SpringCloud框架开发教程(SpringCloudAlibaba微服务分布式架构丨Spring Cloud)教程 本次笔记内容为消费者订单Module模块 1.1 项目名称、目录结构 1.2 Pom.xml <?xml version&q…

box-shadow

0 参数解释 box-shadow:inset offset-x offset-y blur-radius spread-radius color; **inset&#xff1a;**有inset 则为内阴影&#xff0c;没有insert 则为外阴影&#xff0c;默认为外阴影 **offset-x&#xff1a;**横向阴影的大小。正值阴影在右边&#xff1b;负值阴影在左边…

spring入门程序

2023.11.4 今天学习了一下spring的简单使用。 首先需要配置一下spring context和junit的依赖&#xff0c;在pom.xml文件中添加&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><ver…

http中的Content-Type类型

浏览器的Content-Type 最近在做web端下载的时候需要给前端返回一个二进制的流&#xff0c;需要在请求头中设置一个 writer.Header().Set("Content-Type", "application/octet-stream")那么http中的Content-Type有具体有哪些呢&#xff1f;他们具体的使用场…

双十一首战捷报丨Kaadas凯迪仕智能锁品类全网第一 获央视二套采访报道 尽显行业头部品牌风采

2023“双十一”购物狂欢节在如火如荼进行中&#xff0c;智能门锁品类作为智能家居安全体系的重要组成部分&#xff0c;在今年活动中又一次迎来了大卖&#xff0c;智能锁成为了人们购物车里的热门商品。 延续往年势头&#xff0c;Kaadas凯迪仕智能锁今年双11在各大电商平台再次取…

涉及多种位运算操作混合类题目——通过加转三进制(扩大状态,不变枚举量):CF1033F

https://www.luogu.com.cn/problem/CF1033F 我们发现直接用二进制来做很难做&#xff0c;但我们可以观察其给的表 我们发现如果表示成和的形式是容易进行一一对应的 对于询问的时候&#xff0c;我们直接枚举每位有的和是多少&#xff0c;虽然状态是三次的&#xff0c;但是对于…