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.hqwc.cn/news/98581.html

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

相关文章

广告、政府、IT三重合作:凭爱校对轻松搞定文本质量

在广告创意、政府政策和IT开发这三个看似不相关的领域中&#xff0c;有一个共同的需求&#xff1a;高质量的文本内容。本文将探讨如何通过使用“爱校对”工具&#xff0c;在这三个行业内确保文本质量&#xff0c;从而提高工作效率和准确性。 广告行业&#xff1a;语境与创意的完…

全国唯一一所初试考Java的学校!平均300分拿下

苏州科技大学 考研难度&#xff08;☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1187字&#xff0c;预计阅读&#xff1a;3分钟 2023考情概况 苏州科技…

SIP mini对讲 SV-10/SV-10W 86型sip对讲终端

SIP mini对讲 SV-10/SV-10W 86型sip对讲终端 A10系列是专门针对室内用户需求研发的一款SIP mini 对讲产品&#xff0c;集智能安防、音频对讲和广播功能于一体&#xff0c;功能强大&#xff0c;性价比高。它外观小巧&#xff0c;支持按键图标/功能自定义&#xff0c;配备3个可编…

【Java转Go】Go中使用WebSocket实现聊天室(私聊+群聊)

目录 前言功能效果&#xff08;一人分饰多角.jpg&#x1f60e;&#xff09;用户上线、群聊私聊和留言下线 实现思路代码服务端 chat.go 完整代码客户端 html 完整代码 最后 前言 之前在Java中&#xff0c;用 springbootwebsocket 实现了一个聊天室&#xff1a;springbootwebso…

python爬虫关于ip代理池的获取和随机生成

前言 在进行爬虫开发时&#xff0c;代理IP池是一个非常重要的概念。代理IP池是指一个包含多个可用代理IP的集合&#xff0c;这些代理IP可以用来绕过网站的防爬虫策略&#xff0c;从而提高爬取数据的成功率。 在本文中&#xff0c;我们将介绍如何获取代理IP池&#xff0c;并且随…

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

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

2023最新UI工作室官网个人主页源码/背景音乐/随机壁纸/一言

2023最新UI工作室官网个人主页源码/支持背景音乐/随机壁纸/一言 功能介绍&#xff1a; 载入动画 站点简介 Hitokoto 一言 日期及时间 实时天气 时光进度条 音乐播放器 移动端适配 打开文件&#xff1b;index.html和setting.json修改替换你的相关信息&a…

SECOND:Sparsely Embedded Convolutional Detection

论文背景 为了克服图像单独提供空间信息的不足&#xff0c;点云数据在三维应用中变得越来越重要。点云数据包含精确的深度信息&#xff0c;可以由LiDAR或RGB-D相机生成。 VoxelNet&#xff1a;首先将点云数据分组成体素&#xff0c;然后在将体素转换成密集的3D张量用于区域提…

Vue3回到顶部(BackTop)

效果如下图&#xff1a;在线预览 APIs 参数说明类型默认值必传bottomBackTop 距离页面底部的高度number | string40falserightBackTop 距离页面右侧的宽度number | string40falsevisibilityHeight滚动时触发显示回到顶部的高度number180falsetoBackTop 渲染的容器节点 可选 元…

Springboot启动异常 Command line is too long

Springboot启动异常 Command line is too long Springboot启动时直接报异常 Command line is too long. Shorten command line for xxxxxApplication or also for Spring Boot default解决方案: 修改 SystemApplication 的 Shorten command line&#xff0c;选择 JAR manife…

unity tolua热更新框架教程(2)

Lua启动流程 增加脚本luamain&#xff0c;继承luaclient 建立第一个场景GameMain&#xff0c;在对象GameMain挂载脚本LuaMain&#xff0c;启动场景 看到打印&#xff0c;lua被成功加载 lua入口及调用堆栈 这里会执行main.lua文件的main函数 C#接口导出 在此处配置C#导出的代码 …

【综述+3D】基于NeRF的三维视觉2023年度进展报告(截止2023.06.10)

论文&#xff1a;2003.Representing Scenes as Neural Radiance Fields for View Synthesis 官方网站&#xff1a;https://www.matthewtancik.com/nerf 突破性后续改进&#xff1a; Instant Neural Graphics Primitives with a Multiresolution Hash Encoding | 展示官网&#…