Qt 基础组件速学 事件过滤器

学习目标:理解事件过滤器

前置环境

运行环境:qt creator 4.12

学习内容和效果演示:

Qt 提供了事件过滤器的机制,允许我们在事件到达目标对象之前对事件进行拦截和处理。这在以下情况下非常有用:

  1. 全局事件处理: 我们可以在应用程序级别安装一个事件过滤器,拦截所有控件的事件,实现全局性的事件处理逻辑。

  2. 事件委托: 我们可以让某个对象代理其他对象的事件处理,比如父窗口处理子控件的事件。

  3. 事件转发: 我们可以将事件转发给其他对象处理,比如将鼠标事件转发给子控件处理。

理解总结:在对象和事件增加中间层,实现对象和事件是n:1的形式

使用事件过滤器的步骤如下:

  1. 创建一个事件过滤器对象,实现 bool eventFilter(QObject*, QEvent*) 函数。该函数用于处理被过滤的事件。

  2. 在需要过滤事件的对象上安装事件过滤器,使用 installEventFilter() 函数。

  3. 在事件过滤器的 eventFilter() 函数中处理事件,并返回 true 表示事件已经被处理,否则返回 false 让事件继续传播。

实验

想要实现下列效果,正常思路是给这三个img分别写对应的鼠标事件,功能效果几乎一样。

为了代码简化,我想让这三个img的事件都面向一个事件,则可使用中间层 事件过滤器。

 

 详细主要代码

#include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{img1.load("C:/Users/jbj/Pictures/test/a.jpg");img2.load("C:/Users/jbj/Pictures/test/b.jpg");img3.load("C:/Users/jbj/Pictures/test/c.jpg");jpg1 =new QLabel;jpg2 =new QLabel;jpg3 =new QLabel;jpg1->setAlignment(Qt::AlignCenter);jpg1->setPixmap(QPixmap::fromImage(img1));jpg2->setAlignment(Qt::AlignCenter);jpg2->setPixmap(QPixmap::fromImage(img2));jpg3->setAlignment(Qt::AlignCenter);jpg3->setPixmap(QPixmap::fromImage(img3));QHBoxLayout* h=new QHBoxLayout;h->addWidget(jpg1);h->addWidget(jpg2);h->addWidget(jpg3);QWidget *wgt=new QWidget(this);QVBoxLayout* v= new QVBoxLayout(wgt);v->addLayout(h);status =new QLabel("鼠标按键提示信息!");status->setAlignment(Qt::AlignCenter);v->addWidget(status);setCentralWidget(wgt);//中心控件setGeometry(200,200,600,300);// 安装事件过滤jpg1->installEventFilter(this);jpg2->installEventFilter(this);jpg3->installEventFilter(this);}MainWindow::~MainWindow()
{
}
/** 这个函数是 QObject 类的一个虚函数,需要在自定义的事件过滤器类中进行重写。* 它接受两个参数:
QObject* obj: 事件发生的目标对象。QEvent* event: 正在被处理的事件对象。
函数返回值:
如果事件过滤器处理了这个事件,返回 true。
如果事件过滤器没有处理这个事件,返回 false。这样事件就会继续传播给目标对象。
*/
bool MainWindow::eventFilter(QObject* watch,QEvent*e)   {if (watch  == jpg1){if(e->type() == QEvent::MouseButtonPress){// 鼠标移动区域事件,发生在窗户区域QMouseEvent *m =(QMouseEvent*)e;if(m->buttons() & Qt::LeftButton) status->setText("鼠标左键被按下:[左边图片]");if(m->buttons() & Qt::MidButton) status->setText("鼠标中键被按下:[左边图片]");if(m->buttons() & Qt::RightButton) status->setText("鼠标右键被按下:[左边图片]");//对当前图片进行放大2倍 创建了一个 QMatrix 对象,用于存储图像变换矩阵。QMatrix matrix;matrix.scale(2,2);QImage img =img1.transformed(matrix);jpg1->setPixmap(QPixmap::fromImage(img));}if(e->type()== QEvent::MouseButtonRelease)//鼠标松开事件{status->setText("鼠标按键已经释放:[左边图片]");jpg1->setPixmap(QPixmap::fromImage(img1));}}if (watch  == jpg2){if(e->type() == QEvent::MouseButtonPress){// 鼠标移动区域事件,发生在窗户区域QMouseEvent *m =(QMouseEvent*)e;if(m->buttons() & Qt::LeftButton) status->setText("鼠标左键被按下:[中间图片]");if(m->buttons() & Qt::MidButton) status->setText("鼠标中键被按下:[中间图片]");if(m->buttons() & Qt::RightButton) status->setText("鼠标右键被按下:[中间图片]");//对当前图片进行放大2倍QMatrix matrix;matrix.scale(2,2);jpg2->setPixmap(QPixmap::fromImage(img2.transformed(matrix)));}if(e->type()== QEvent::MouseButtonRelease)//鼠标松开事件{status->setText("鼠标按键已经释放:[中间图片]");jpg2->setPixmap(QPixmap::fromImage(img2));}}if (watch  == jpg3){if(e->type() == QEvent::MouseButtonPress){// 鼠标移动区域事件,发生在窗户区域QMouseEvent *m =(QMouseEvent*)e;if(m->buttons() & Qt::LeftButton) status->setText("鼠标左键被按下:[右边图片]");if(m->buttons() & Qt::MidButton) status->setText("鼠标中键被按下:[右边图片]");if(m->buttons() & Qt::RightButton) status->setText("鼠标右键被按下:[右边图片]");//对当前图片进行放大2倍QMatrix matrix;matrix.scale(2,2);jpg3->setPixmap(QPixmap::fromImage(img3.transformed(matrix)));}if(e->type()== QEvent::MouseButtonRelease)//鼠标松开事件{status->setText("鼠标按键已经释放:[右边图片]");jpg3->setPixmap(QPixmap::fromImage(img3));}}return QMainWindow::eventFilter(watch,e);
}

总结:

Qt 事件过滤器的主要特点和使用场景:

  1. 事件拦截和处理:

    • 事件过滤器允许我们在事件到达目标对象之前对事件进行拦截和处理。
    • 我们可以在 eventFilter() 函数中检查和处理各种类型的事件,如鼠标事件、键盘事件、paint 事件等。
  2. 自定义事件处理逻辑:

    • 通过事件过滤器,我们可以实现各种自定义的事件处理逻辑,如全局性的事件处理、事件委托和事件转发等。
    • 这在需要跨控件或跨对象进行事件处理时非常有用。
  3. 安装和使用:

    • 我们需要创建一个自定义的事件过滤器类,并实现 eventFilter() 函数。
    • 然后在需要过滤事件的对象上安装事件过滤器,使用 installEventFilter() 函数。
  4. 常见使用场景:

    • 全局事件处理: 在应用程序级别安装事件过滤器,拦截所有控件的事件,实现全局性的事件处理逻辑。
    • 事件委托: 让某个对象代理其他对象的事件处理,比如父窗口处理子控件的事件。
    • 事件转发: 将事件转发给其他对象处理,比如将鼠标事件转发给子控件处理。
  5. 返回值含义:

    • 如果事件过滤器处理了这个事件,返回 true
    • 如果事件过滤器没有处理这个事件,返回 false。这样事件就会继续传播给目标对象。

总之,事件过滤器是 Qt 提供的一个强大的机制,可以帮助我们实现各种复杂的事件处理逻辑。它的核心是 eventFilter() 函数,通过对这个函数的实现,我们可以根据需求灵活地拦截和处理事件。

最后附上源代码链接
对您有帮助的话,帮忙点个star

28-event-fillter · jbjnb/Qt demo - 码云 - 开源中国 (gitee.com)

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

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

相关文章

工控人最爱的PLC触摸屏一体机,有多香

PLC触摸屏一体机是什么 PLC触摸屏一体机,听起来可能有点技术化,但简单来说,它就是一个集成了可编程逻辑控制器(PLC)和触摸屏的智能设备。这种设备不仅能够执行自动化控制任务,还能实时显示和操作设备状态&a…

JVM原理(十九):JVM虚拟机内存模型

1. 硬件的效率与一致性 数据不安全的原因:缓存一致性的问题 共享内存多核系统:在多路处理器系统中,每个处理器都有自己的高速缓存,而他们又共享同一主内存。 线程先后执行结果不一致问题:除了增加高速缓存之外&#…

【Python】已解决:nltk.download(‘stopwords‘) 报错问题

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:nltk.download(‘stopwords’) 报错问题 一、分析问题背景 在使用Python的自然语言处理库NLTK(Natural Language Toolkit)时&#xff0c…

CentOS 7安装Elasticsearch7.7.0和Kibana

一. 准备安装包 elasticsearch和kibana:官网历史版本找到并下载(https://www.elastic.co/cn/downloads/past-releases#elasticsearch)ik分词器:GitHub下载(https://github.com/infinilabs/analysis-ik/releases/tag/v…

设计模式之状态机模式

一、状态机模式介绍 状态机模式(State Machine Pattern)是一种用于描述对象行为的软件设计模式,属于行为型设计模式。在状态机模式中,对象的行为取决于其内部状态,并且在不同的状态下,对象可能会有不同的行…

STM32F103C8T6核心板原理图和PCB分享

PCB图 原理图 资料下载地址: 原理图PCB库: https://545c.com/d/45573183-61875742-29897c?p7526 (访问密码: 7526)

[go-zero] 简单微服务调用

文章目录 1.注意事项2.服务划分及创建2.1 用户微服务2.2 订单微服务 3.启动服务3.1 etcd 服务启动3.2 微服务启动3.3 测试访问 1.注意事项 go-zero微服务的注册中心默认使用的是Etcd。 本小节将以一个订单服务调用用户服务来简单演示一下,其实订单服务是api服务&a…

Java 使用sql查询mongodb

在现代应用开发中,关系型数据库和NoSQL数据库各有千秋。MongoDB作为一种流行的NoSQL数据库,以其灵活的文档模型和强大的扩展能力,受到广泛欢迎。然而,有时开发者可能更熟悉SQL查询语法,或者需要在现有系统中复用SQL查询…

【ARMv8/v9 GIC 系列 5.6 -- GIC 超优先级中断详细介绍】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 Interrupt superpriority超优先级中断的特性和应用Physical interface interrupt signalsPhysical Group 1 Non-NMI for Current Security StatePhysical Group 1 for Other Security State, or a Group 0 Non-NMIPhysical Group 1 …

进程控制-wait和waitpid进程回收

wait 阻塞函数 函数作用: 1. 阻塞并等待子进程退出 2. 回收子进程残留资源 3. 获取子进程结束状态(退出原因) pid_t wait(int *wstatus); 返回值: ‐1 : 回收失败,已经没有子进程了 >0 : 回收子进程对应的…

一种非凸全变差正则化的信号降噪方法(以模拟信号和轴承振动信号为例,MATLAB)

以旋转机械振动信号为例,由于旋转机械运行中背景噪声较强,振动信号需要进行降噪处理。常用的小波阈值降噪会在信号的不连续处产生虚假的波峰和伪吉布森震荡,而奇异值分解SVD去噪容易产生虚假分量,全变差去噪则不会出现这样的情况&…

深入理解JS逆向代理与环境监测

博客文章:深入理解JS逆向代理与环境监测 1. 引言 首先要明确JavaScript(JS)在真实网页浏览器环境和Node.js环境中有很多使用特性的区别。尤其是在环境监测和对象原型链的检测方面。本文将探讨如何使用JS的代理(Proxy&#xff09…

STM32-USART

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. 串口通信协议1.1 通信接口1.2 串口通信1.3 硬件电路1.4 电平标准1.5 串口参数及时序1.6 串口时序 2. USART串口通信2.1 USART简介2.2 USART框图2.3 USART基本结构2.4 数据帧2.5 数据帧-配置停止位2.6 起始位侦测2.…

【Python】一文向您详细介绍 argparse中 action=‘store_true’ 的作用

【Python】一文向您详细介绍 argparse中 action‘store_true’ 的作用 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:98…

pdf怎么转换成图片格式文件,pdf文档怎么转换成图片格式

在数字化时代,pdf文件转换成图片格式是一种常见的操作,无论是在工作还是日常生活中,我们总会遇到需要将pdf文件转换为图片的需求。这可能是因为图片格式更易于分享、展示或编辑。那么,如何高效地将pdf转换成图片呢?本文…

图神经网络实战(16)——经典图生成算法

图神经网络实战(16)——经典图生成算法 0. 前言1. 图生成技术2. Erdős–Rnyi模型3. 小世界模型小结系列链接 0. 前言 图生成算法是指用于创建模拟图或网络结构的算法,这些算法可以根据特定的规则和概率分布生成具有特定属性的图&#xff0c…

将大型语言模型模块化打造协作智能体

B UILDING C OOPERATIVE E MBODIED A GENTS MODULARLY WITH L ARGE L ANGUAGE M ODELS 论文链接: https://arxiv.org/abs/2307.02485https://arxiv.org/abs/2307.02485 1.概述 在去中心化控制及多任务环境中,多智能体合作问题因原始感官观察、高昂…

【机器学习】机器学习重塑广告营销:精准触达,高效转化的未来之路

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀目录 📒1. 引言📙2. 机器学习基础与广告营销的结合🧩机器学习在广告营销中的核心应用领域🌹用…

【React】React18 Hooks 之 useReducer

目录 useReducer案例1:useReducer不带初始化函数案例2:useReducer带初始化函数注意事项1:dispatch函数不会改变正在运行的代码的状态注意事项2:获取dispatch函数触发后 JavaScript 变量的值注意事项3:触发了reducer&am…

Spring Boot集成olingo快速入门demo

1.什么是olingo? Apache Olingo 是个 Java 库,用来实现 Open Data Protocol (OData)。 Apache Olingo 包括服务客户端和 OData 服务器方面。 Open Data Protocol (开放数据协议,OData) 是用来查询和更新数据的一种W…