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.rhkb.cn/news/370190.html

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

相关文章

JVM(13):虚拟机性能分析和故障解决工具之Visual VM

1 Visual VM作用 是到目前为止随JDK发布的功能最强大的运行监视和故障处理程序,并且可以遇见在未来一段时间内都是官方主力发展的虚拟机故障处理工具。官方在VisualVM的软件说明中写上了“All-in-One”的描述字样,预示着他除了运行监视、故障处理外&…

Android在framework层添加自定义服务的流程

环境说明 ubuntu16.04android4.1java version “1.6.0_45”GNU Make 3.81gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 可能有人会问,现在都2024了怎么还在用android4版本,早都过时了。确实,现在最新的都是Android13、And…

基于YOLOv5的人脸目标检测

本文是在之前的基于yolov5的人脸关键点检测项目上扩展来的。因为人脸目标检测的效果将直接影响到人脸关键点检测的效果,因此本文主要讲解利用yolov5训练人脸目标检测(关键点检测可以看我人脸关键点检测文章) 基于yolov5的人脸关键点检测:人脸关键点检测…

复现YOLO_ORB_SLAM3_with_pointcloud_map项目记录

文章目录 1.环境问题2.遇到的问题2.1编译问题1 monotonic_clock2.2 associate.py2.3 associate.py问题 3.运行问题 1.环境问题 首先环境大家就按照github上的指定环境安装即可 环境怎么安装网上大把的资源,自己去找。 2.遇到的问题 2.1编译问题1 monotonic_cloc…

Android增量更新----java版

一、背景 开发过程中,随着apk包越来越大,全量更新会使得耗时,同时浪费流量,为了节省时间,使用增量更新解决。网上很多文章都不是很清楚,没有手把手教学,使得很多初学者,摸不着头脑&a…

jmeter测试工具学习

1.双击jar包打开,发现那个bat打不开 2.新建plan之后编辑添加线程组 会加入500*5次请求 3.添加HTTP请求 添加字段 为了让http请求发送到不同的分片,要把userid随机化 4.添加监听器 5.聚合报告

Wish卖家必读:如何安全有效地进行店铺测评

Wish以其独特的商业模式和先进的技术在电商领域独树一帜。作为北美和欧洲最大的移动电商平台之一,Wish拥有庞大的用户基础,其中90%的卖家来自中国,这不仅显示了其在全球电商市场中的影响力,也反映了其对中国卖家的吸引力。 Wish平…

vxe-table合并行数据;element-plus的el-table动态合并行

文章目录 一、vxe-table合并行数据1.代码 二、使用element-plus的el-table动态合并行2.代码 注意&#xff1a;const fields 是要合并的字段 一、vxe-table合并行数据 1.代码 <vxe-tableborderresizableheight"500":scroll-y"{enabled: false}":span-m…

Ubuntu 22.04远程自动登录桌面环境

如果需要远程自动登录桌面环境&#xff0c;首先需要将Ubuntu的自动登录打开&#xff0c;在【settings】-【user】下面 然后要设置【Sharing】进行桌面共享&#xff0c;Ubuntu有自带的桌面共享功能&#xff0c;不需要另外去安装xrdp或者vnc之类的工具了 点开【Remote Desktop】…

window系统openssl开发环境搭建(VS2017)

window系统openssl开发环境搭建 VS2017 一、下载openssl二、安装openssl三、openssl项目配置3.1 配置include文件3.2 配置openssl动态库四、编写openssl测试代码五、问题总结5.1 问题 一5.2 问题二一、下载openssl https://slproweb.com/products/Win32OpenSSL.html 根据自己…

CTF实战:从入门到提升

CTF实战&#xff1a;从入门到提升 &#x1f680;前言 没有网络安全就没有国家安全&#xff0c;网络安全不仅关系到国家整体信息安全&#xff0c;也关系到民生安全。近年来&#xff0c;随着全国各行各业信息化的发展&#xff0c;网络与信息安全得到了进一步重视&#xff0c;越…

【总线】AXI4第八课时:介绍AXI的 “原子访问“ :独占访问(Exclusive Access)和锁定访问(Locked Access)

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣&#xff0c;那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者&#xff0c;AXI4以其高性能和高度可扩展性&#xff0c;成为了现代电子系统中不可或缺的通信桥梁…

力扣习题--找不同

目录 前言 题目和解析 1、找不同 2、 思路和解析 总结 前言 本系列的所有习题均来自于力扣网站LeetBook - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 题目和解析 1、找不同 给定两个字符串 s 和 t &#xff0c;它们只包含小写字母。 字符串 t…

Web 基础与 HTTP 协议

Web 基础与 HTTP 协议 一、Web 基础1.1域名和 DNS域名的概念Hosts 文件DNS&#xff08;Domain Name System 域名系统&#xff09;域名注册 1.2网页与 HTML网页概述HTML 概述网站和主页Web1.0 与 Web2.0 1.3静态网页与动态网页静态网页动态网页 二、HTTP 协议1.1HTTP 协议概述1.…

跨界客户服务:拓展服务边界,创造更多价值

在当今这个日新月异的商业时代&#xff0c;跨界合作已不再是新鲜词汇&#xff0c;它如同一股强劲的东风&#xff0c;吹散了行业间的壁垒&#xff0c;为企业服务创新开辟了前所未有的广阔天地。特别是在客户服务领域&#xff0c;跨界合作正以前所未有的深度和广度&#xff0c;拓…

刷题之多数元素(leetcode)

多数元素 哈希表解法&#xff1a; class Solution { public:/*int majorityElement(vector<int>& nums) {//map记录元素出现的次数&#xff0c;遍历map&#xff0c;求出出现次数最多的元素unordered_map<int,int>map;for(int i0;i<nums.size();i){map[nu…

llama2阅读: logits是什么?

Logits是一个在深度学习中&#xff0c;几乎一直都有的概念&#xff0c;它意味着模型unnormalized final scores. 然后你可以通过softmax得到模型针对你class的概率分布。 而在llama2的代码中&#xff0c;同样有logits的使用&#xff0c;那么针对llama2&#xff0c;logits的作用…

英国“王曼爱华”指的是哪几所高校?中英双语介绍

中文版 英国“王曼爱华”指的是伦敦大学国王学院、曼彻斯特大学、爱丁堡大学和华威大学这四所院校。以下是对伦敦大学国王学院、曼彻斯特大学、爱丁堡大学和华威大学这四所英国顶尖大学的详细介绍&#xff0c;包括它们的建校历史、专业优势、优秀校友和地理位置。 伦敦大学国…

HTTP协议格式

目录 正文&#xff1a; 1.概述 2.主要特点 3.请求协议格式 4.响应协议格式 5.响应状态码 总结&#xff1a; 正文&#xff1a; 1.概述 HTTP 协议是用于传输超文本数据&#xff08;如 HTML&#xff09;的应用层协议&#xff0c;它建立在传输层协议 TCP/IP 之上。当我们在…

C语言之常用内存函数以及模拟实现

目录 前言 一、memcpy的使用和模拟实现 二、memmove的使用和模拟实现 三、memset的使用和模拟实现 四、memcmp的使用和模拟实现 总结 前言 本文主要讲述C语言中常用的内存函数&#xff1a;memcpy、memmove、memset、memcmp。内容不多&#xff0c;除了了解如何使用&#x…