Qt之事件过滤—筛选处理对象

文章目录

  • 事件过滤
    • 完整代码

事件过滤

事件过滤是当事件发生时,可以对不同对象,实现不同操作,以达到筛选的效果。
步骤:
1、首先安装一个事件过滤器,为对象安装事件过滤,指定“谁”来监控这些事件对象

//给m_label123安装事件过滤,指定(this)当前整个窗体监视我们的事件对象
m_label1->installEventFilter(this);
m_label2->installEventFilter(this);
m_label3->installEventFilter(this);

2、重写bool eventFilter(QObject *obj, QEvent *event)。

//第一个参数是监视对象,第二个参数是事件
bool EventFilter::eventFilter(QObject *watched, QEvent *event)
{QMatrix matrix;QImage tmpImg;//放大图片matrix.scale(2.0,2.0);if(watched == m_label1){//鼠标按下事件if(event->type() == QEvent::MouseButtonPress){QMouseEvent* mouseEvent = (QMouseEvent*)event;if(mouseEvent->buttons()&Qt::LeftButton){m_stateLabel->setText(QStringLiteral("左键按下图片1"));}if(mouseEvent->buttons()&Qt::MidButton){m_stateLabel->setText(QStringLiteral("中键按下图片1"));}if(mouseEvent->buttons()&Qt::RightButton){m_stateLabel->setText(QStringLiteral("右键按下图片1"));}tmpImg = m_image1.transformed(matrix);m_label1->setPixmap(QPixmap::fromImage(tmpImg));}if(event->type()==QEvent::MouseButtonRelease){m_stateLabel->setText(QStringLiteral("鼠标释放图片1"));m_label1->setPixmap(QPixmap::fromImage(m_image1));}}else if(watched == m_label2){//鼠标按下事件if(event->type() == QEvent::MouseButtonPress){QMouseEvent* mouseEvent = (QMouseEvent*)event;if(mouseEvent->buttons()&Qt::LeftButton){m_stateLabel->setText(QStringLiteral("左键按下图片2"));}if(mouseEvent->buttons()&Qt::MidButton){m_stateLabel->setText(QString("中键按下图片2"));}if(mouseEvent->buttons()&Qt::RightButton){m_stateLabel->setText(QString("右键按下图片2"));}tmpImg = m_image2.transformed(matrix);m_label2->setPixmap(QPixmap::fromImage(tmpImg));}if(event->type()==QEvent::MouseButtonRelease){m_stateLabel->setText(QStringLiteral("鼠标释放图片2"));m_label2->setPixmap(QPixmap::fromImage(m_image2));}}else if(watched == m_label3){//鼠标按下事件if(event->type() == QEvent::MouseButtonPress){QMouseEvent* mouseEvent = (QMouseEvent*)event;if(mouseEvent->buttons()&Qt::LeftButton){m_stateLabel->setText(QStringLiteral("左键按下图片3"));}if(mouseEvent->buttons()&Qt::MidButton){m_stateLabel->setText(QStringLiteral("中键按下图片3"));}if(mouseEvent->buttons()&Qt::RightButton){m_stateLabel->setText(QStringLiteral("右键按下图片3"));}tmpImg = m_image3.transformed(matrix);m_label3->setPixmap(QPixmap::fromImage(tmpImg));}if(event->type()==QEvent::MouseButtonRelease){m_stateLabel->setText(QStringLiteral("鼠标释放图片3"));m_label3->setPixmap(QPixmap::fromImage(m_image3));}}//将事件交给上层对话框进行处理return QDialog::eventFilter(watched,event);
}

完整代码

eventfilter.h

#ifndef EVENTFILTER_H
#define EVENTFILTER_H#include <QDialog>
#include <QLabel>
class EventFilter : public QDialog
{Q_OBJECTpublic:EventFilter(QWidget *parent = 0,Qt::WindowFlags f = 0);~EventFilter();
public slots://第一个参数是监视的对象,第二个参数是事件bool eventFilter(QObject*watched,QEvent *event)override;
private://将图片加载到label中QLabel* m_label1;QLabel* m_label2;QLabel* m_label3;QLabel* m_stateLabel;//QImage m_image1;QImage m_image2;QImage m_image3;
};#endif // EVENTFILTER_H

eventfilter.cpp

#include "eventfilter.h"
#include <QPixmap>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QEvent>
#include <QMouseEvent>
EventFilter::EventFilter(QWidget *parent,Qt::WindowFlags f): QDialog(parent,f)
{setWindowTitle(QStringLiteral("事件过滤"));m_label1 = new QLabel;m_label2 = new QLabel;m_label3 = new QLabel;m_stateLabel = new QLabel(QStringLiteral("鼠标按下标志"));//加个框框//m_stateLabel->setFrameStyle(QFrame::Box);//设置对齐方式:水平居中m_stateLabel->setAlignment(Qt::AlignHCenter);m_image1.load("./fly1.png");m_image2.load("./fly2.png");m_image3.load("./fly3.png");m_label1->setPixmap(QPixmap::fromImage(m_image1));m_label2->setPixmap(QPixmap::fromImage(m_image2));m_label3->setPixmap(QPixmap::fromImage(m_image3));QHBoxLayout* layout = new QHBoxLayout;layout->addWidget(m_label1);layout->addWidget(m_label2);layout->addWidget(m_label3);QVBoxLayout* mainLayout = new QVBoxLayout(this);mainLayout->addLayout(layout);mainLayout->addWidget(m_stateLabel);resize(m_image2.width() * 3,m_image2.height() * 2);//给m_label123安装事件过滤,指定(this)当前整个窗体监视我们的事件对象m_label1->installEventFilter(this);m_label2->installEventFilter(this);m_label3->installEventFilter(this);}EventFilter::~EventFilter()
{}
//第一个参数是监视对象,第二个参数是事件
bool EventFilter::eventFilter(QObject *watched, QEvent *event)
{QMatrix matrix;QImage tmpImg;//放大图片matrix.scale(2.0,2.0);if(watched == m_label1){//鼠标按下事件if(event->type() == QEvent::MouseButtonPress){QMouseEvent* mouseEvent = (QMouseEvent*)event;if(mouseEvent->buttons()&Qt::LeftButton){m_stateLabel->setText(QStringLiteral("左键按下图片1"));}if(mouseEvent->buttons()&Qt::MidButton){m_stateLabel->setText(QStringLiteral("中键按下图片1"));}if(mouseEvent->buttons()&Qt::RightButton){m_stateLabel->setText(QStringLiteral("右键按下图片1"));}tmpImg = m_image1.transformed(matrix);m_label1->setPixmap(QPixmap::fromImage(tmpImg));}if(event->type()==QEvent::MouseButtonRelease){m_stateLabel->setText(QStringLiteral("鼠标释放图片1"));m_label1->setPixmap(QPixmap::fromImage(m_image1));}}else if(watched == m_label2){//鼠标按下事件if(event->type() == QEvent::MouseButtonPress){QMouseEvent* mouseEvent = (QMouseEvent*)event;if(mouseEvent->buttons()&Qt::LeftButton){m_stateLabel->setText(QStringLiteral("左键按下图片2"));}if(mouseEvent->buttons()&Qt::MidButton){m_stateLabel->setText(QString("中键按下图片2"));}if(mouseEvent->buttons()&Qt::RightButton){m_stateLabel->setText(QString("右键按下图片2"));}tmpImg = m_image2.transformed(matrix);m_label2->setPixmap(QPixmap::fromImage(tmpImg));}if(event->type()==QEvent::MouseButtonRelease){m_stateLabel->setText(QStringLiteral("鼠标释放图片2"));m_label2->setPixmap(QPixmap::fromImage(m_image2));}}else if(watched == m_label3){//鼠标按下事件if(event->type() == QEvent::MouseButtonPress){QMouseEvent* mouseEvent = (QMouseEvent*)event;if(mouseEvent->buttons()&Qt::LeftButton){m_stateLabel->setText(QStringLiteral("左键按下图片3"));}if(mouseEvent->buttons()&Qt::MidButton){m_stateLabel->setText(QStringLiteral("中键按下图片3"));}if(mouseEvent->buttons()&Qt::RightButton){m_stateLabel->setText(QStringLiteral("右键按下图片3"));}tmpImg = m_image3.transformed(matrix);m_label3->setPixmap(QPixmap::fromImage(tmpImg));}if(event->type()==QEvent::MouseButtonRelease){m_stateLabel->setText(QStringLiteral("鼠标释放图片3"));m_label3->setPixmap(QPixmap::fromImage(m_image3));}}//将事件交给上层对话框进行处理return QDialog::eventFilter(watched,event);
}

运行效果👇
在这里插入图片描述

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

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

相关文章

vue3+ts+uniapp实现小程序端input获取焦点计算上推页面距离

vue3tsuniapp实现小程序端input获取焦点计算上推页面距离 input获取焦点计算上推页面距离 1.先说我这边的需求2.发现问题3.解决思路4.代码展示 自我记录 1.先说我这边的需求 需求 1.给键盘同级添加一个按钮例如’下一步’ or ‘确认’ 这种按钮 2.初步想法就是获取input焦点时…

【LeetCode-中等题】146. LRU 缓存

文章目录 题目方法一&#xff1a;直接继承LinkedHashMap调用api方法二&#xff1a;自定义LinkedHashMap HashMap ListNode LinkedHashMap 题目 LRU缓存是什么&#xff1a;LRU缓存机制&#xff0c;你想知道的这里都有 实现 LRU 缓存算法 方法一&#xff1a;直接继承Linked…

单臂路由实验:通过Trunk和子接口实现VLAN互通

文章目录 一、实验背景与目的二、实验拓扑三、实验需求四、实验解法1. PC 配置 IP 地址2. PC3 属于 Vlan10&#xff0c;PC4 属于 Vlan20&#xff0c;配置单臂路由实现 Vlan10 和 Vlan20 三层互通3. 测试在 PC3 上 Ping PC4 &#xff0c;可以 Ping 通 PC4 摘要&#xff1a; 本文…

数学建模:回归分析

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 数学建模&#xff1a;回归分析 文章目录 数学建模&#xff1a;回归分析回归分析多元线性回归案例 多项式回归一元多项式回归多元二项式回归 非线性回归逐步回归 回归分析 多元线性回归 案例 首先进行回归分…

ASP.NET Core 中的 MVC架构

MVC 架构 MVC架构把 App 按照逻辑分成三层&#xff1a; Controllers&#xff0c;接收 http request&#xff0c;配合 model&#xff0c;通过http response 返回 view&#xff0c;尽量不做别的事Models, 负责业务逻辑&#xff0c;App 的状态&#xff0c;以及数据处理Views&…

JVM的故事——虚拟机字节码执行引擎

虚拟机字节码执行引擎 文章目录 虚拟机字节码执行引擎一、概述二、运行时栈帧结构三、方法调用 一、概述 执行引擎Java虚拟机的核心组成之一&#xff0c;它是由软件自行实现的&#xff0c;能够执行那些不被硬件直接支持的指令集格式。 对于不同的虚拟机实现&#xff0c;执行引…

【网络安全带你练爬虫-100练】第20练:数据处理-并写入到指定文档位置

目录 一、目标1&#xff1a;解码去标签 二、目标2&#xff1a;提取标签内内容 三、目标3&#xff1a;处理后的数据插入原位置 四、目标4&#xff1a;将指定的内容插入指定的位置 五、目标5&#xff1a;设置上下文字体格式 六、目标6&#xff1a;向多个不同位置插入不同的…

企业如何充分借助大数据下精准营销?

技术的发展和智能终端的普及移动互联网用户的大规模增长使移动互联网快速发展&#xff0c;使中国移动互联网软件进入移动互联网时代越来越多地涉及到改变生活大家习惯。移动互联网时代的到来也意味着大数据时代的到来。精准营销数据方法&#xff0c;移动互联网和大数据的兴起不…

ZLMediaKit 重建docker包

1.下载容器到本地服务器并运行 #此镜像为github持续集成自动编译推送&#xff0c;跟代码(master分支)保持最新状态 docker run -id -p 1935:1935 -p 8080:80 -p 8443:443 -p 8554:554 -p 10000:10000 -p 10000:10000/udp -p 8000:8000/udp -p 9000:9000/udp zlmediakit/zlmedi…

App自动化测试持续集成效率提高50%

持续集成是一种开发实践&#xff0c;它倡导团队成员需要频繁的集成他们的工作&#xff0c;每次集成都通过自动化构建&#xff08;包括编译、构建、自动化测试&#xff09;来验证&#xff0c;从而尽快地发现集成中的错误。让正在开发的软件始终处于可工作状态&#xff0c;让产品…

拦截器和异常处理器

拦截器和异常处理器 拦截器 拦截器(Interceptor)&#xff0c;主要完成请求参数的解析、将页面表单参数赋给值栈中相应属性、执行功能检验、程序异常调试等工作。 准备 创建模块 如下为完整的项目结构 web.xml <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee&qu…

macos 不支持svn安装

macos 10.13可能不支持svn命令,所以要安装 xcode-select --install 弹窗在线安装失败的话只能手动下载安装 打开:Sign In - Apple 搜索Command Line Tools (macOS 10.13) 下载9.4.1版本直接安装后即可

利用vba处理Excel表格数据实现键值转化,适用于将编码转化成对应的文本

最近遇到了一个甲方需要提供系统登录的用户名单和对应的角色权限内容。无奈直接从数据库导出的数据对应的都是编码&#xff0c;没有转成中文&#xff0c;想着偷个懒能不能直接用Excel直接转&#xff0c;网上看了一下有修改单元格格式的&#xff0c;但需要编码是2到3个。多的就用…

TCP机制之连接管理(三次握手和四次挥手详解)

TCP的连接管理机制描述了连接如何创建以及如何断开! 建立连接(三次握手) 三次握手的过程 所谓建立连接就是通信双方各自要记录对方的信息,彼此之间要相互认同;这里以A B双方确立男女朋友关系为例: 从图中可以看出,通信双方各自向对方发起一个"建立连接"的请求,同时…

RK3568-i2c-适配8010rtc时钟芯片

硬件连接 从硬件原理图中可以看出&#xff0c;rtc时钟芯片挂载在i2c3总线上&#xff0c;设备地址需要查看芯片数据手册。编写设备树 &i2c3 {status "okay";rx8010: rx801032 {compatible "epson,rx8010";reg <0x32>;}; };使能驱动 /kernel/…

Redis布隆过滤器原理

其实布隆过滤器本质上要解决的问题&#xff0c;就是防止很多没有意义的、恶意的请求穿透Redis&#xff08;因为Redis中没有数据&#xff09;直接打入到DB。它是Redis中的一个modules&#xff0c;其实可以理解为一个插件&#xff0c;用来拓展实现额外的功能。 可以简单理解布隆…

【闭源期刊】Elsevier旗下,1区(TOP),3个月录用

闭源期刊 1区&#xff08;TOP&#xff09; 出版社&#xff1a;Elsevier 影响因子&#xff1a;IF&#xff08;2022&#xff09;8.5-9.0 期刊分区&#xff1a;JCR1区&#xff0c;中科院2区&#xff08;无预警记录&#xff09; 检索情况&#xff1a;SCIE&EI 双检&#xff…

slog正式版来了:Go日志记录新选择!

在大约一年前&#xff0c;我就写下了《slog&#xff1a;Go官方版结构化日志包[1]》一文&#xff0c;文中介绍了Go团队正在设计并计划在下一个Go版本中落地的Go官方结构化日志包&#xff1a;slog[2]。但slog并未如预期在Go 1.20版本[3]中落地&#xff0c;而是在golang.org/x/exp…

Vulnhub: Hogwarts: Bellatrix靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.228 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.228访问80端口 查看源码&#xff0c;提示ikilledsiriusblack.php和文件包含的参数名file 漏洞利用 ikilledsiriusblack.p…

【Eclipse】搭建python环境;运行第一个python程序helloword

目录 0.环境 1.需准备&搭建思路 2.搭建具体步骤 1&#xff09;查看是否安装过python 2&#xff09;安装eclipse 3&#xff09;安装和配置pyDev 3.创建第一个python程序具体步骤 1&#xff09;新建项目 2&#xff09;输入项目名字&#xff0c;和配置选项 3&#x…