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

news2025/7/13 12:14:58

文章目录

  • 事件过滤
    • 完整代码

事件过滤

事件过滤是当事件发生时,可以对不同对象,实现不同操作,以达到筛选的效果。
步骤:
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_OBJECT

public:
    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.coloradmin.cn/o/975388.html

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

相关文章

“多行业信赖选择:为什么出版、金融和教育都爱‘爱校对’“

在当今的数字时代&#xff0c;文本是我们沟通、传播知识和进行交易的主要工具。不论是出版行业的图书、金融行业的报告&#xff0c;还是教育行业的教材&#xff0c;文字的准确性都是不可或缺的。那么&#xff0c;为什么在这些关键行业中&#xff0c;“爱校对”成为了许多机构和…

【实践篇】Redis缓存和数据库一致性问题

Redis缓存和数据库一致性问题 文章目录 Redis缓存和数据库一致性问题0. 前言参考资料 1. 缓存和数据库的数据不一致是如何发生的&#xff1f;1. 删除数据的情况&#xff1a;2. 修改数据的情况&#xff1a; 0. 前言 确保缓存和数据库之间的数据一致性是一项挑战&#xff0c;这需…

【Kafka系列】(一)Kafka入门

有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 Kafka是什么&#xff1f; 一句话概括&#xff1a;「Apache Kafka 是一款开源的消息引擎系统」 什么是消息引擎系统&#…

软件测试代码覆盖率

在<professional software testing with visual studio 2005 team system tools for software developer>中提到了代码覆盖率&#xff0c;我很久没有去书店了&#xff0c;不知道是不是出了新的版本&#xff0c;觉得书里面关于代码覆盖率方面的知识有些地方没有讲&#xf…

RobotFramework自动化测试框架系列学习----(二)库与关键字

一、类库和标准库 在RIDE中&#xff0c;按F5可查看库和关键字标准库 &#xff08;RF自带的库&#xff0c;不需要额外安装&#xff09; Buitln 测试库 Collections 集合库 DateTime 时间库 Screenshot 截屏库 存放位置&#xff1a;Python37\Lib\site-packages\robot\libraries …

点成案例丨比浊仪助力牙周炎诱发因素研究

牙周炎概述 牙周炎&#xff08;Periodontitis&#xff09;是一种炎症性疾病&#xff0c;其主要特征为牙周袋的形成及袋壁的炎症、牙槽骨吸收而导致牙龈与牙齿分离、牙齿逐渐松动或掉落等。牙周炎主要是由积聚在牙龈及其附近牙面、齿颈缘的牙菌斑内细菌所分泌的毒素令牙周组织发…

Linux命令200例:xargs标准输入的数据作为参数传递使用

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0…

DeepFaceLab和DeepFaceLive下载地址

DeepFaceLab和DeepFaceLive下载地址 项目地址&#xff1a;https://github.com/iperov/DeepFaceLab 下载地址&#xff1a;https://disk.yandex.ru/d/7i5XTKIKVg5UUg 需要科学上网 还有一个其他版本的磁力 magnet:?xturn:btih:e7ffdcb4ada863de9504f2a741f924dcd56ab84a&…

智安网络|加强软件供应链安全保障:共同抵御威胁的关键路径

在当今数字化时代&#xff0c;软件供应链安全成为了一个备受关注的话题。各行各业都依赖于软件产品和服务来支持其业务运营。然而&#xff0c;随着供应链的不断扩大和复杂化&#xff0c;软件供应链安全问题也日益突出。那么应该如何解决&#xff1f; 首先&#xff0c;软件供应…

开了抖店后就可以直播带货了吗?想在抖音带货的,建议认真看完!

我是王路飞。 关于抖店和直播带货的关系&#xff0c;其实很多人经常搞不清楚。 不然的话&#xff0c;也不会有这个问题的出现了&#xff1a;开了抖店后就可以直播带货了吗&#xff1f; 在我看来&#xff0c;这个问题很简单&#xff0c;但在不了解抖音电商和直播带货其中门道…

postgres源码解析55 Brin Index--2(brinbuild流程)

上一篇讲解了brin index的基本概念以及页布局postgres源码解析54 Brin Index–1&#xff0c;后续会从源码角度对索引的构建、维护等方面进行深入讲解。 1 关键数据结构 2 brinbuild执行流程图 3 brinbuild 函数详解 1 首先调用brin_matepage_init初始化brin meta元数据页&…

【Day_29慢就是快】代码随想录-二叉树-二叉树的所有路径

给定一个二叉树&#xff0c;返回所有从根节点到叶子节点的路径。 思路 求根节点到叶子节点的路径&#xff0c;需要前序遍历&#xff0c;方便让父节点指向孩子节点&#xff0c;找到对应的路径。 使用递归方法做前序遍历&#xff0c;递归与回溯是一家的。 递归 1. 递归参数及返…

C++ Opencv视频检测

使用OpenCV进行视频检测的一般步骤如下&#xff1a;导入OpenCV库和视频文件。 对每一个视频帧进行对象检测。可以使用诸如Haar特征分类器、Cascade分类器或深度学习模型等技术进行对象检测。 #include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> …

OpenLdap +PhpLdapAdmin + Grafana docker-compose部署安装

目录 一、OpenLdap介绍 二、PhpLdapAdmin介绍 三、使用docker-compose进行安装 1. docker-compose.yml 2. grafana配置文件 3. provisioning 四、安装openldap、phpldapadmin、grafana 五、配置OpenLDAP 1. 登陆PhpLdapAdmin web管理 2. 需要注意的细节 内容介绍参考…

Linux系统的安装

文章目录 1 Linux介绍1.1 Linux是什么1.2 Linux的特点1.3 Linux的应用1.4 Linux的发行版本1.5 Linux的Shell 2 Linux安装2.1 安装方式2.2 什么是VMware2.3 VMware主要功能2.4 什么是CentOS2.5 VMware与CentOS与Linux的关系2.6 VMware安装CentOS的步骤 1 Linux介绍 1.1 Linux是…

【前沿资讯】2023年最新遥感类SCIE/ESCI期刊影响因子汇总

6月28日&#xff0c;Clarivate发布了最新的JCR报告&#xff0c;公布了期刊的最新SCIE影响因子&#xff0c;并首次发布了ESCI期刊的影响因子。其中归入遥感“remote sensing”类的SCIE期刊有33本&#xff0c;归入ESCI期刊的有25本&#xff0c;以下分别为它们的相关指标。 表1 遥…

【LeetCode75】第四十六题 除法求值

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们多个二维数组形式的除法等式&#xff0c;在二维数组里有两个字符串&#xff0c;表示同名的未知数&#xff0c;另一个数组中对应…

SpringBoot 集成 Canal 实现监听MySQL表数据

SpringBoot 集成 Canal 准备工作什么是 CanalCanal 在 Spring Boot 中的作用和优势准备工作安装和配置 MySQL 数据库 安装Canal项目集成导入依赖添加配置信息创建监听类测试 准备工作 什么是 Canal Canal 是阿里巴巴开源的基于数据库增量日志解析的数据同步和订阅组件&#x…

写得了代码,焊得了板!嵌入式开发工程师必修之代码管理方案(下)

目录 极狐GitLab嵌入式开发场景解决方案 3.1 高可用部署与灾备 3.2 组织管理 3.3 分支策略 3.4 分支保护 3.5 推送规则 3.6 代码评审 3.7 数据保护 3.8 其他相关 本文来自 武让 极狐GitLab 高级解决方案架构师 &#x1f4a1; 前两篇文章&#xff0c;作者介绍了嵌入式开…

接口自动化测试系列-接入测试平台

测试平台目录 测试平台自建源码 后台核心代码 def add_api(kwags):"""插入api数据"""try:join_info CaseApi(namekwags.get("name"), httpTypekwags.get("httpType"),headerskwags.get("headers") if kwags.ge…