Qt--事件过滤器

news2024/12/24 9:19:04

写在前面

Qt中的事件过滤器(Event Filter)是一种机制,用于拦截并处理特定类型的事件。但和Qt–事件分发器一文中提到的事件分发器有些区别。

事件过滤器的工作原理

这里同样使用一个简单的示例图帮助理解:
事件过滤器
这里假设有一个Widget父窗口,该窗口中有三个自定义的控件,而且这三个自定义控件中都有重写事件分发器事件。

当父窗口收到来自消息循环的某一事件(信号)时,若父窗口有安装事件过滤器,则会在事件过滤器函数中判断该事件要发往哪个控件(子控件),这就是事件过滤器的作用。

事件过滤器的使用

要使用事件过滤器,需进行以下两步:
①给需要事件过滤的子控件安装事件过滤器
②重写父窗口的事件过滤器函数

例这里在Widget父窗口中给label子控件安装事件过滤器,并在Widget父窗口中重写事件过滤器,以过滤发往label子控件的事件。

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    //重写事件过滤器
    bool eventFilter(QObject* obj, QEvent* e);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

#include "widget.h"
#include "ui_widget.h"
#include <QEvent>
#include <QMouseEvent>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //安装事件过滤器
    ui->label->installEventFilter(this);


}

Widget::~Widget()
{
    delete ui;
}

//重写事件过滤器
bool Widget::eventFilter(QObject* obj, QEvent* e)
{
    //拦截发往label子控件的鼠标按下事件
    if (obj == ui->label)
    {
        if (e->type() == QEvent::MouseButtonPress)
        {
            QMouseEvent* mouseEv = static_cast<QMouseEvent*>(e);
            QString qs = QString("父窗口的事件过滤器中拦截鼠标按下, x = %1, y = %2").arg(mouseEv->x()).arg(mouseEv->y());
            qDebug() << qs;

            return true;
        }

    }

    return QWidget::eventFilter(obj, e);
}

运行可以看到鼠标按下事件会在Widget的事件过滤器中被拦截:
事件过滤器效果

事件过滤器和事件分发器的区别

Qt中的事件分发器(Event Dispatcher)和事件过滤器(Event Filter)都是用于处理事件的机制,但它们的作用和实现方式有所不同。

事件分发器(Event Dispatcher)是Qt中的一个重要组件,它负责将一个对象发出的事件分发给该对象的所有子对象,以及所有被该对象设置为接受该事件类型的父对象。事件分发器可以确保同一时间只有一个子对象或父对象接收到同一个事件,从而避免了事件冲突(event collision)的问题。事件分发器还提供了一些高级功能,如事件分组(event grouping)、事件预取(event prefetching)等,可以进一步提高应用程序的性能和响应速度。

事件过滤器(Event Filter)则是一种简单的事件处理机制,它允许一个对象拦截并处理其他对象发出的特定类型的事件。事件过滤器通过重载 QObject 类中的两个函数:bool eventFilter(QObject *obj, QEvent *event) 来实现对事件的拦截和处理。当一个对象发出一个事件时,如果该事件符合当前对象正在拦截的事件类型,那么该对象就会调用 eventFilter() 函数进行处理;否则,它会继续将该事件分发给其他对象。

总之,事件分发器和事件过滤器都是用于处理事件的机制,但它们的实现方式和作用不同。事件分发器可以确保同一时间只有一个子对象或父对象接收到同一个事件,并且提供了一些高级功能;而事件过滤器则是一种简单的事件处理机制,允许一个对象拦截并处理其他对象发出的特定类型的事件。

总结

通过一个简单的示例熟悉事件过滤器的工作原理,同时也分析了和事件分发器的区别,相信在后续开发中,也可按照实际需要判断是否需要事件分发或过滤。

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

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

相关文章

服务间的通信(RestTemplate +Ribbon+Feign):

服务之间的依赖&#xff1a; 其实根据上图我们发现会员管理服务其实是依赖于我们图书的这个服务的&#xff0c;那么为什么要依赖于图书这个服务呢&#xff0c;因为会员服务想要进行借阅图书的时候&#xff0c;必须要对图书模块的图书的库存等做校验才可以&#xff0c;所以membe…

在 Kubernetes 上实现高速应用交付

原文作者&#xff1a;NGINX 原文链接&#xff1a;在 Kubernetes 上实现高速应用交付 转载来源&#xff1a;NGINX 官方网站 NGINX 唯一中文官方社区 &#xff0c;尽在 nginx.org.cn 运行于 Kubernetes 之上的应用需要一个经过验证的生产级应用交付解决方案。NGINX Ingress Cont…

边缘计算AI硬件智能分析网关V1版的接入流程与使用步骤

我们的AI边缘计算网关硬件——智能分析网关目前有两个版本&#xff1a;V1版与V2版&#xff0c;两个版本都能实现对监控视频的智能识别和分析&#xff0c;支持抓拍、记录、告警等&#xff0c;在AI算法的种类上和视频接入上&#xff0c;两个版本存在些许的区别。V1的基础算法有人…

【ChatGPT】《吴恩达 x OpenAI Prompt Engineering教程中文笔记》- 知识点目录

《吴恩达 x OpenAI Prompt Engineering教程中文笔记》 &#x1f433; 在开始编写提示词之前的一些设置 不同的temperature会影响模型的理性和想象力&#xff0c;这里告诉我们&#xff1a; Low&#xff1a;例如GPT4&#xff0c;更加适合确定性的问答任务Hight&#xff1a;例如…

non-protected broadcast场景分析及解决

non-protected broadcast场景分析及解决 在两个app之间互相送消息使用BroadcastReceiver&#xff0c;有时在运行过程中在logcat工具中会发现大片的飘红消息。 要消除这些错误信息&#xff0c;需要在广播的 Sender 和 Receiver 做部分的修改。 错误信息分析 由于 发送端 的 M…

忆享聚焦|ChatGPT、AI、网络数字、游戏……近期热点资讯一览

“忆享聚焦”栏目第十四期来啦&#xff01;本栏目汇集近期互联网最新资讯&#xff0c;聚焦前沿科技&#xff0c;关注行业发展动态&#xff0c;筛选高质量讯息&#xff0c;拓宽用户视野&#xff0c;让您以最低的时间成本获取最有价值的行业资讯。 目录 行业资讯 1.科技部部长王志…

上海亚商投顾:沪指跌1.28%失守年线 大金融板块集体走弱

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日继续调整&#xff0c;沪指超1%逼近3200点&#xff0c;尾盘失守年线&#xff0c;创业板指较为抗跌。大…

你收藏了那些实用工具类网站?

今天来给大家分享几个众多网友们推荐的&#xff0c;宝藏工具类网站 uIGradients https://uigradients.com/#Flickr 专业的渐变色配色工具网站&#xff0c;配色什么的非常全&#xff0c;也可以按照自己的想法来选择搭配&#xff0c;还能直接获得对应渐变配色的CSS代码&#xff…

水表自动抄表系统有什么功能

水表自动抄表系统是一种新型的智能化管理系统&#xff0c;它可以自动采集水表的数据&#xff0c;并且实时上传到管理平台&#xff0c;实现了水表的实时监测和管理。该系统具有以下几个主要功能&#xff1a; 1.自动抄表功能 水表自动抄表系统可以实现自动采集水表的数据&#x…

【学习笔记】Windows 下线程同步之互斥锁

目录 前言环境简介相关函数CreateMutex Wait 函数ReleaseMutexCloseHandle 其他互斥锁的名字未命名互斥锁的同步互斥锁的意外终止临界区对象 参考 前言 本文所涉及的同步主要描述在 Windows 环境下的机制&#xff0c;和 Linux 中的同步机制有一定的联系&#xff0c;但注意并不…

小猫踩球-第14届蓝桥杯省赛Scratch中级组真题第2题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第137讲。 小猫踩球&#xff0c;本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程中级组真题第2题&#xf…

智慧档案馆一体化监控系统设计所需要的10条依据

1.科学性 本项目目标定位为&#xff1a;以科学技术为基础&#xff0c;依靠先进的设备和优越的设计理念、科学客观的管理&#xff0c;利用信息化管理及相关最新技术&#xff0c;将库房实际环境与存储技术、计算机技术、无线自动控制技术、通讯与信息处理技术等先进技术相结合&a…

Python appium搭建app自动化测试环境

目录 前言 App自动化环境安装 安装安卓开发工具 安装模拟器 前言 appium做app自动化测试&#xff0c;环境搭建是比较麻烦的。 也是很多初学者在学习app自动化之时&#xff0c;花很多时间都难跨越的坎。 但没有成功的环境&#xff0c;就没有办法继续后续的使用。 在app自…

面试技术点

一、对热修复、插件化、模块化、组件化有一定研究。 1、模块化 将共享部分或业务模块抽取出来形成独立module。 2、组件化 基于模块化&#xff0c;核心思想是角色的转换&#xff0c;在打包时是library&#xff0c;分离独立的业务组件如微信朋友圈。 3、热修复和插件化种类、…

在Kaggle上使用Stable Diffusion进行AI绘图

前言 因为使用Stable Diffusion进行AI绘图需要GPU&#xff0c;这让其应用得到了限制本文介绍如何在Kaggle中部署Stable Diffusion&#xff0c;并使用免费的P100 GPU进行推理&#xff08;每周可免费使用30小时&#xff09;&#xff0c;部署好后可以在任意移动端使用。本项目在s…

2023全球最佳医院榜单及简要介绍

作为医学类的访问学者、博士后及联合培养博士们&#xff0c;都希望到世界知名医院进行临床研修交流及科研学习。2023 年世界最佳医院排行榜的发布为申请者提供了目标平台&#xff0c;现知识人网小编整理刊出。 近期&#xff0c;《新闻周刊》和全球数据公司 Statista 推出了2023…

拿了7家大厂offer后,整理出来的笔记.....

我第一次接触自动化是在2016年。那时刚毕业一年有余&#xff0c;组内一直做手工功能测试&#xff0c;大概在2018年9月&#xff0c;部门领导要求测试组引入自动化。组内之前从没有开展过任何自动化&#xff0c;测试主管安排了一个刚入职不久的研究生同事去研究。 当时自己内心还…

UniApp原生插件制作

参考1&#xff1a;UniApp官网-原生插件开发 参考2&#xff1a;uniapp Android 原生插件开发 一、下载安装Android Studio 本部分不在赘述 二、下载UniApp离线SDK 下载地址&#xff1a;Android 离线SDK - 正式版 | uni小程序SDK 三、解压下载文件&#xff0c;并导入Androi…

蓝精灵协会:如何将传统 IP 融入 Web3

作者&#xff1a;Cedric Hervet&#xff0c;联合创始人&#xff0c;创意总监 我和许多项目合作过&#xff0c;并且担任了近 30 年的艺术总监和创意总监。我的方法一直是创造同质化的宇宙&#xff0c;把观众带入并使他们产生梦想。但我也曾系统地寻找过那份额外的感动&#xff1…

微服务解码:揭示API的优势挑战与最佳实践

在当今快节奏的软件开发环境中&#xff0c;微服务已成为一种流行的架构模式。但微服务到底是什么&#xff1f;简而言之&#xff0c;微服务是一种将应用程序构建为松耦合、细粒度服务集合的方式&#xff0c;这些服务通过轻量级协议进行通信。这种架构风格使团队能够独立开发和部…