Qt5开发从入门到精通——第十一篇三节(Qt5 事件处理及实例——事件过滤及实例)

news2025/1/15 17:35:26

提示:欢迎小伙伴的点评✨✨,相互学习c/c++应用开发。🍳🍳🍳
博主🧑🧑 本着开源的精神交流Qt开发的经验、将持续更新续章,为社区贡献博主自身的开源精神👩‍🚀

文章目录

  • 前言
  • 一、事件过滤及实例概述
  • 二、效果实例
  • 三、原码实例
    • eventfilter.h
    • eventfilter.cpp
    • main.cpp
    • EventFilter解析
  • 四、总结


前言

本章节会给大家带来Qt5 事件处理及实例——事件过滤及实例详解。


一、事件过滤及实例概述

Qt 的事件模型中提供的事件过滤器功能使得 一个 QObject 对象可以监视另 一个 QObject 对象中的事件,通过在一个 QObject 对象中安装事件过滤器,可以在事件到达该对象前捕获事件,从而起到监视该对象事件的作用。
例如, Qt 已经提供了 QPushButton 用千表示一个普通的按钮类。如果需要实现一个动态的图片按钮,即当鼠标键按下时按钮图片发生变化,则需要同时响应鼠标按下等事件。

二、效果实例

三个图片分别对应三个 QLabel 对象 。 当用鼠标键按下某个图片时,图片大小会发生变化;而释放鼠标键时,图片又恢复初始大小,并且程序将提示当前事件的状态信息,如鼠标键类型、被鼠标键按下的图片序号。
新建Resources 并建立image文件 添加现有Src将tu.png图片放入其中
图一
在这里插入图片描述

图二
在这里插入图片描述

三、原码实例

eventfilter.h

#ifndef EVENTFILTER_H
#define EVENTFILTER_H

#include <QDialog>
#include <QLabel>
#include <QImage>
#include <QEvent>
class EventFilter : public QDialog
{
    Q_OBJECT

public:
    EventFilter(QWidget *parent = 0);
    ~EventFilter();
public slots:
    bool eventFilter(QObject *, QEvent *);
private:
    QLabel *label1;
    QLabel *label2;
    QLabel *label3;
    QLabel *stateLabel;
    QImage Image1;
    QImage Image2;
    QImage Image3;
};

#endif // EVENTFILTER_H

eventfilter.cpp

#include "eventfilter.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QMouseEvent>
#include <QMatrix>
EventFilter::EventFilter(QWidget *parent)
    : QDialog(parent)
{


    setWindowTitle(tr(" 事件过滤")) ;
    label1 = new QLabel;
    Image1.load(":/Src/13.png");

    label1->setAlignment (Qt::AlignHCenter|Qt::AlignVCenter);
    label1->setPixmap(QPixmap::fromImage(Image1));
    label2 = new QLabel;
    Image2.load(":/Src/14.png");
    label2->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    label2->setPixmap(QPixmap::fromImage(Image2));
    label3 = new QLabel;
    Image3.load(":/Src/15.png");
    label3->setAlignment (Qt::AlignHCenter|Qt::AlignVCenter);
    label3->setPixmap(QPixmap::fromImage(Image3));
    stateLabel = new QLabel(tr("鼠标键按下标志"));
    stateLabel->setAlignment(Qt::AlignHCenter);
    QHBoxLayout *layout=new QHBoxLayout;
    layout->addWidget(label1);
    layout->addWidget(label2);
    layout->addWidget(label3);
    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    mainLayout->addLayout(layout);
    mainLayout->addWidget(stateLabel);
    label1->installEventFilter(this);
    label2->installEventFilter(this);
    label3->installEventFilter(this);
    /* installEventFilterO函数为每一个图片安装事件过滤器,
     * 指定整个窗体为监视事件的对象,函数原型如下:
     * void QObject::installEventFilter
     * (
     *      QObject * filterObj
     * )
     * 参数 filterObj 是监视事件的对象,此对象可以通过 eventFilter()函数接收事件。如果某个事
     * 件需要被过滤,即停止正常的事件响应,则在 eventFilter()函数中返回 true, 否则返回 false 。
     * QObject 的 removeEventFilter() 函数可以解除已安装的事件过滤器。
     */


    
}

EventFilter::~EventFilter()
{

}

/*QObject 的事件监视函数 eventFilter()的具体实现*/
bool EventFilter::eventFilter(QObject *watched, QEvent *event)
{
    if(watched==label1) //首先判断当前发生事件的对象
    {
        ///判断发生的事件类型
        if(event->type()==QEvent::MouseButtonPress)
        {
            //将事件 event 转化为鼠标事件
            QMouseEvent *mouseEvent= (QMouseEvent *) event;
            /**以下根据鼠标键的类型分别显示*/
            if (mouseEvent->buttons()&Qt::LeftButton)
            {
                stateLabel->setText(tr("左键按下左边图片"));
            }
            else if (mouseEvent->buttons ()&Qt::MidButton)
            {
                stateLabel->setText(tr(" 中键按下左边图片"));
            }else if(mouseEvent->buttons()&Qt::RightButton)
            {
                stateLabel->setText(tr(" 右键按下左边图片")) ;
            }
            /*显示缩小的图片*/
            QMatrix matrix;
            matrix.scale(1.8,1.8);
            QImage tmpimg=Image1.transformed(matrix);
            label1->setPixmap(QPixmap::fromImage(tmpimg));
        }
         /*鼠标释放事件的处理,恢复图片的大小*/
        if(event->type()==QEvent::MouseButtonRelease)
        {
            stateLabel->setText(tr(" 鼠标释放左边图片")) ;
            label1->setPixmap(QPixmap::fromImage(Image1));
        }
    }else if(watched==label2)
    {
        ///判断发生的事件类型
        if(event->type()==QEvent::MouseButtonPress)
        {
            //将事件 event 转化为鼠标事件
            QMouseEvent *mouseEvent= (QMouseEvent *) event;
            /**以下根据鼠标键的类型分别显示*/
            if (mouseEvent->buttons()&Qt::LeftButton)
            {
                stateLabel->setText(tr("左键按下中间图片"));
            }
            else if (mouseEvent->buttons ()&Qt::MidButton)
            {
                stateLabel->setText(tr(" 中键按下中间图片"));
            }else if(mouseEvent->buttons()&Qt::RightButton)
            {
                stateLabel->setText(tr(" 右键按下中间图片")) ;
            }
            /*显示缩小的图片*/
            QMatrix matrix;
            matrix.scale(1.8,1.8);
            QImage tmpimg=Image2.transformed(matrix);
            label2->setPixmap(QPixmap::fromImage(tmpimg));
        }
         /*鼠标释放事件的处理,恢复图片的大小*/
        if(event->type()==QEvent::MouseButtonRelease)
        {
            stateLabel->setText(tr(" 鼠标释放中间图片")) ;
            label2->setPixmap(QPixmap::fromImage(Image2));
        }
    }else if(watched==label3)
    {
        ///判断发生的事件类型
        if(event->type()==QEvent::MouseButtonPress)
        {
            //将事件 event 转化为鼠标事件
            QMouseEvent *mouseEvent= (QMouseEvent *) event;
            /**以下根据鼠标键的类型分别显示*/
            if (mouseEvent->buttons()&Qt::LeftButton)
            {
                stateLabel->setText(tr("左键按下右边图片"));
            }
            else if (mouseEvent->buttons ()&Qt::MidButton)
            {
                stateLabel->setText(tr(" 中键按下右边图片"));
            }else if(mouseEvent->buttons()&Qt::RightButton)
            {
                stateLabel->setText(tr(" 右键按下右边图片")) ;
            }
            /*显示缩小的图片*/
            QMatrix matrix;
            matrix.scale(1.8,1.8);
            QImage tmpimg=Image3.transformed(matrix);
            label3->setPixmap(QPixmap::fromImage(tmpimg));
        }
         /*鼠标释放事件的处理,恢复图片的大小*/
        if(event->type()==QEvent::MouseButtonRelease)
        {
            stateLabel->setText(tr(" 鼠标释放右边图片")) ;
            label3->setPixmap(QPixmap::fromImage(Image3));
        }
    }

    //将事件交给上层对话框
    return QDialog::eventFilter(watched,event);
}

main.cpp

#include "eventfilter.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    EventFilter w;
    w.show();

    return a.exec();
}

EventFilter解析

  1. void QObject::installEventFilter (QObject* filterObj);
    把filterObj对象安装(或注册)为事件过滤器,filterObj也称为过滤器对象。事件过滤器通常在构造函数中进行注册。
  2. bool QObject::eventFilter(QObject* obj, QEvent* e);
    来接收拦截到的事件。也就是说拦截到的事件在filterObj对象中的eventFilter函数中处理。eventFilter的第一个参数obj指向的是事件本应传递到的目标对象。
  3. 使用QObject::removeEventFilter(QObject *obj);函数可以删除事件过滤器。

四、总结

Qt5 事件处理及实例——事件过滤及实例会在应用程序开发中经常用到的。

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

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

相关文章

WPF XAML介绍

一、XAML 简介 XAML是一种声明性标记语言&#xff0c;它简化了为.NET Framework应用程序创建UI的过程。在声明性XAML标记中创建可见的UI元素&#xff0c;可以折叠隐藏代码&#xff0c;使程序界面编程更加简单和简洁。 XAML直接以程序集中定义的一组特定后备类型表示对象的实例化…

Oracle Primavera Unifier组合管理器(Portfolio Manager)

目录 一&#xff1a;前言 二&#xff1a;介绍​​​​​​​ 一&#xff1a;前言 Oracle Primavera Unifier uDesigner Portfolio Manager 项目组合管理器是公司的预算员/计划工程师可以收集项目&#xff08;计划和执行中&#xff09;的成本和进度信息&#xff0c;并对“假设…

Webpack 5 超详细解读(六)

51.TerserPlugin 压缩 JS webapck中提供了压缩 js 代码的方式,可以移除无用代码、替换变量名等,减少编译后文件体积,提升加载速度。 不同mode 在 webpack配置文件 webpack.config.js中通过将 mode设置为 development或者 production,会对代码进行不同的处理。 可以发现,…

使用阿里云发送短信验证码

目录 一、用户注册登录流程 二、使用阿里云发送短信验证码 ⭐生成密钥 ⭐将密钥配置到项目中 ⚪新建properties文件并填入相应信息 ⚪pom配置 ​⚪ 测试代码 ⚪添加签名 ​⚪添加短信发送的模板 &#x1f4a7;验证码防盗刷监控 一、用户注册登录流程 二、使用阿里…

Linux服务器更改ssh连接端口

更改ssh连接端口 输入vim /etc/ssh/sshd_config编辑sshd配置 在键盘上按“I”键&#xff0c;进入编辑状态 添加新的远程服务端口&#xff0c;以 222 端口为例。在Port 22下面添加输入Port 222 建议&#xff1a;不要直接修改 22 端口&#xff0c;把Port 22前面的注释符号#删除…

股票买卖Ⅴ

题目描述 给定一个长度为 NNN 的数组&#xff0c;数组中的第 iii 个数字表示一个给定股票在第 iii 天的价格。 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;: 你不能同时参与多笔交…

高精地图_语义地图_众包地图相关论文笔记

1.20220618_LT-mapper: A Modular Framework for LiDAR-based Lifelong Mapping 20213d-Lidar构建long-term地图分为 SLAM模块&#xff08;每个session的点云地图通过关键帧构建&#xff0c;对不同session的关键帧进行anchor node检测&#xff0c;基于anchor帧构建的闭环因子实…

VSCode中Java程序入口的数据输入流的常用形式

1.前言 VSCode需要配置好Java环境&#xff0c;配置链接按官网教程即可&#xff1a;Getting Started with Java in Visual Studio Code VSCode目录./vscode下文件说明如下&#xff1a; setting.json &#xff1a; 配置vscode编辑器特性配置&#xff0c;同时基础Java Project中…

如何避免缓存穿透、缓存击穿、缓存雪崩?

缓存雪崩&#xff1a; 缓存雪崩是指缓存同⼀时间⼤⾯积的失效&#xff0c;所以&#xff0c;后⾯的请求都会落到数据库上&#xff0c;造成数据库短时间内承受⼤量请求⽽崩掉。解决方案&#xff1a; 缓存数据的过期时间设置随机&#xff0c;防⽌同⼀时间⼤量数据过期现象发⽣。…

微信小程序接入火山引擎埋点数据

1&#xff0c;文档中心-火山引擎 2&#xff0c;文档中心-火山引擎 3&#xff0c;文档中心-火山引擎 上面的链接是三个最重点的部分。 首先按照1的步骤安装SDK。npm install datarangers/sdk-mp 配置合法域名将https://mcs.volceapplog.com添加到小程序后台的“request合法域…

你能懂的 Reflect 反射

你能懂得 JS 之 Reflect 反射 上一篇文章《Proxy 代理对象使用详解即原理总结》我们详细介绍了 Proxy 代理对象的使用及其工作原理&#xff08;不了解的同学可以去看看哦&#xff09;&#xff0c;今天我们来聊聊它的好兄弟 Reflect 反射。 特点 Reflect 是一个内置全局对象&a…

[go学习笔记.第十六章.TCP编程] 4.项目-海量用户即时通讯系统-显示在线用户列表,群聊

1.实现功能-完成登录时能返回当前在线用户 用户登录后,可以得到当前在线用户列表 示意图如下: 步骤: (1).编写了server/processBlock/userManager.go package processBlockimport ("fmt" )//因为UserManager实例在服务器中有且只有一个,并且在很多地方都要使用,因…

博客系统前端页面

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 博客系统 前言 一.预期效果 博客列表页效果 博客正文页效果 博客登录页效果 博客编辑页效果 二.实现博客列表页 实现导航栏 实现版心 实现个人信息 …

【DELM分类】基于matlab麻雀搜索算法改进深度学习极限学习机数据分类【含Matlab源码 2235期】

⛄一、麻雀搜索算法改进深度学习极限学习机数据分类 1 深度极限学习机 深度极限学习机算法(Deep Extreme Learning Machine, DELM)又称多层极限学习机.存在N个训练样本&#xff0c;其中 2 麻雀搜索算法(SSA) 2020年&#xff0c;薛建凯等人提出了麻雀搜索算法.麻雀搜索算法是一…

python判断语句

一、布尔类型和比较运算符 布尔类型 只有两个结果 是 / 否 定义变量存储布尔类型数据&#xff1a; 变量名称布尔类型字面量 布尔类型的数据不仅可以通过定义得到也可以通过比较运算符比较内容得到 比较运算符&#xff1a; 二、if判断语句基本格式 程序中的判断&#…

如何鉴别一个成功的Scrum 教练?

成功的Scrum教练&#xff1a;如何鉴别一个成功的Scrum教练&#xff1f;了解更多关于优秀的Scrum专家的特征。 前言: 成功的Scrum 教练 - 我认为的九大标准 如何判别Scrum 教练是否是合格的&#xff1f;Scrum 教练成功的标准是什么&#xff1f;经常使用Confluence回顾性模板是不…

java创建线程的方式到底有几种?(详解)

创建线程的方式到底有几种&#xff1f;一&#xff0c;创建多线程的方式1&#xff0c;官方解释2&#xff0c;实现Runnable接口3&#xff0c;继承Thread类3&#xff0c;二者区别3.1&#xff0c;本质区别3.2&#xff0c;优先考虑使用第一种二&#xff0c;误以为是创建线程的几种新…

react(子传父、父传子)

目录 1. 父传子 数组/对象 的两种写法 2. 子传父&#xff1a; 3. 生成唯一id的库&#xff1a; 4. 对接收的组件进行验证 1. 父传子 数组/对象 的两种写法 function App() {const obj [{age:19},{age:19}]return (<div className"App"><header classNa…

Jmeter常用参数化技巧总结

说起接口测试&#xff0c;相信大家在工作中用的最多的还是Jmeter。 JMeter是一个100&#xff05;的纯Java桌面应用&#xff0c;由Apache组织的开放源代码项目&#xff0c;它是功能和性能测试的工具。具有高可扩展性、支持Web(HTTP/HTTPS)、SOAP、FTP、JAVA 等多种协议。 在做…

uniapp之使用map组件显示接收过来的经纬度

目录 前言 效果图 提示 总代码 分析 1.显示自己位置的属性 2.markers 点标记 前言 由于项目的需求&#xff0c;我需要从主页面接收经纬度&#xff0c;并渲染至地图上面&#xff0c;同时呢&#xff0c;也要在该位置上显示图标标记点&#xff08;红色&#xff09;&#x…