1.2.1 Qt中事件是如何进行传递——实例篇(下)

1.2.1 Qt中事件是如何进行传递
1.2.2 Qt中的事件过滤器(eventFilter)
1.2.3 如何自己模拟发送事件消息

一、Qt中事件是如何进行传递-代码篇

上一篇中我们讲解了Qt中的事件,通过流程图给大家展示了事件的传递过程,今天就通过代码来给大家实操一下,验证流程图的走向。

EventTestWgt.h

#ifndef _EVENT_TEST_WGT_H
#define _EVENT_TEST_WGT_H

#include <QWidget>
#include <QApplication>

class MyApplication : public QApplication
{
public:
	MyApplication(int &argc, char **argv);

	bool notify(QObject *receiver, QEvent *e);
};

// 事件过滤器对象;
class EventFilterObj : public QObject
{
public:
	EventFilterObj(QObject* parent = nullptr);

private:
	bool eventFilter(QObject *watched, QEvent *event);

};

class EventTestWgt : public QWidget
{
	Q_OBJECT

public:
	EventTestWgt(QWidget *parent = nullptr);
	~EventTestWgt();

private:
	void mousePressEvent(QMouseEvent *event);

private:
	bool event(QEvent* ev);
	bool eventFilter(QObject *watched, QEvent *event);

private:
	EventFilterObj* m_eFilterObj;
};
#endif // _EVENT_TEST_WGT_H

EventTestWgt.cpp

#include "EventTestWgt.h"
#include <QDebug>
#include <QMouseEvent>
#include <QEvent>

MyApplication::MyApplication(int &argc, char **argv)
	: QApplication(argc, argv)
{
}

bool MyApplication::notify(QObject *receiver, QEvent *e)
{
   	if (QEvent::MouseButtonPress == e->type()) {
        qDebug() << "MyApplication::notify - " << "Class Name:" << receiver->metaObject()->className()
        	<< "Event:" << e->type();
	}
    
    // 这里一定要返回父类的函数,要不然事件没法继续传递;
    return QApplication::notify(receiver, e);
}

EventFilterObj::EventFilterObj(QObject* parent /*= nullptr*/)
	: QObject(parent)
{
}

bool EventFilterObj::eventFilter(QObject *watched, QEvent *event)
{
    if (QEvent::MouseButtonPress == event->type())
    {
        qDebug() << "EventFilterObj::eventFilter"
        << "Class Name:" << watched->metaObject()->className()
        << "Event:" << event->type();
    }
    
    return QObject::eventFilter(watched, event);
}

EventTestWgt::EventTestWgt(QWidget *parent)
	: QWidget(parent)
{
    // 创建事件过滤器对象;
    m_eFilterObj = new EventFilterObj(this);
    
    // 给自己安装事件过滤器;
    this->installEventFilter(this);
    // 安装外部事件过滤器;
    this->installEventFilter(m_eFilterObj);
    
    this->resize(300, 200);
}

EventTestWgt::~EventTestWgt()
{
}

void EventTestWgt::mousePressEvent(QMouseEvent *event)
{
    qDebug() << "EventTestWgt::mousePressEvent";
    
    return QWidget::mousePressEvent(event);
}

bool EventTestWgt::eventFilter(QObject *watched, QEvent *event)
{
    if (watched == this){
        if (QEvent::MouseButtonPress == event->type())
        {
            qDebug() << "EventTestWgt::eventFilter - "
            	<< "Class Name:" << watched->metaObject()->className()
            	<< "Event:" << event->type();
        }
	}
    
    return QWidget::eventFilter(watched, event);
}

bool EventTestWgt::event(QEvent* ev)
{
    if (QEvent::MouseButtonPress == ev->type()){
        qDebug() << "EventTestWgt::event - MouseButtonPress";
    }
    
    // 其他事件使用父类的方法继续进行传递处理;
    return QWidget::event(ev);
}

int main(int argc, char *argv[])
{
    // 这个一定要用重写的MyApplication类;
    MyApplication a(argc, argv);
    
    EventTestWgt wgt;
    wgt.show();
    
    return a.exec();
}

图一:事件传递流程图

在这里插入图片描述

在上面的例子中我们做了这几件事来监测鼠标按下事件:

  1. 我们继承了QApplication,重写了notify方法;
  2. 新建了事件过滤器类EventFilterObj;
  3. EventTestWgt类中添加了自己的事件过滤器(即对象可以给本身安装事件过滤器);
  4. EventTestWgt类中重写了event方法;
  5. EventTestWgt类中重写了mousePressEvent方法;

关于事件过滤器,这里我们新建了一个专门的事件过滤器类来进行验证,也可以自己重写自己本身的事件过滤器然后给自己安装上,这样就是自己监测自己了,本篇主要验证事件的传递流程,事件过滤器在下篇文章中再详细说明。
我们可以对照着上方图一的事件传递流程图,然后下方图二这个空白的窗口就是运行界面,然后我们鼠标点击一下这个界面,就有了图三的编译器中打印的信息。

图二:程序实际运行图

在这里插入图片描述

图三:程序运行结果输出图

在这里插入图片描述


从图三的打印信息中,我们看到上方代码的运行结果,验证Qt中事件实际传递的顺序如下:

在这里插入图片描述

建议大家使用示例代码自己再改一改测试一下其他的事件,或者再结合一些实例去解决一些问题,我们在了解到Qt事件的传递机制之后,这样更方便我们在实际应用中想到在哪个流程去更准确地过滤或者去处理一些相应的事件,而不会影响其他控件接收事件,或者继续传递等问题。

QT 事件的传递先后顺序 目录 一、Qt提供5个级别的事件处理和过滤 (从后到先): 1、重新实现事件函数。 2、重新实现QObject::event(). 3、安装事件过滤器 4、在 QApplication 上安装事件过滤器。 5、重新实现QApplication 的 notify()方法. 二、event 与 Even Filter 1. event() 简介 2. event 返回值的作用 3... 阅读详情

相关推荐

QT父子窗口事件传递与事件过滤器

处理监控系统的时候遇到问题,在MainWidget中创建多个子Widget的时候,原意是想鼠标点击先让MainWidget截获处理后再分派给子Widget去处理,但调试后发现如果子Widget重新实现了事件方法,就直接处理掉事件了,没有进到MainWidget的处理方法中去,如果子Widget没有accept或ignore该事件,则该事件就会被传递给其父亲,在子Widget存在accept或ignore事件的时候,想要经过一下MainWidget的处理方法,就得用到事件处理器,因此网上找了一下,发现QT的事

QtCompany的博客 1378

Qt事件系统:Qt中的事件处理与传递

在 Qt 中,事件作为一个对象,继承自 QEvent 类,常见的有键盘事件 QKeyEvent、鼠标事件 QMouseEvent 和定时器事件 QTimerEvent 等,与 QEvent 类的继承关系图如下所示。本章会详细讲解这 3 个常见的事件,还会涉及事件过滤器和自定义事件的知识。关于本章的相关内容,可以在 Qt 帮助中通过 The Event System 关键字查看。

QtCompany的博客 759

1.2.1 Qt中事件是如何进行传递——叙述篇(上)

建议大家使用示例代码自己再改一改测试一下其他的事件,或者再结合一些实例去解决一些问题,我们在了解到Qt事件的传递机制之后,这样更方便我们在实际应用中想到在哪个流程去更准确地过滤或者去处理一些相应的事件,而不会影响其他控件接收事件,或者继续传递等问题。关于事件过滤器,这里我们新建了一个专门的事件过滤器类来进行验证,也可以自己重写自己本身的事件过滤器然后给自己安装上,这样就是自己监测自己了,本篇主要验证事件的传递流程,事件过滤器在下篇文章中再详细说明。,就有了图三的编译器中打印的信息。

前行之路还需前行 1357

Qt项目开发实例 (含源码)

qt教程、qt项目、qt下载、qt项目实战、qt多线程。本文通过分析demo源码,QT实战的方式进行学习,学习路线是以实战为目录,全面的使用自己的学习知识,文章中编写一系列的学习游戏demo,与大家一起分享。

啊渊的专栏 14万+

1.2.2 Qt中的事件过滤器(eventFilter)详解

1.2.1 Qt中事件是如何进行传递 1.2.2 Qt中的事件过滤器(eventFilter) 1.2.3 如何自己模拟发送事件消息 一、Qt中事件过滤器详解 我们先看下另外两个相关的方法,一个是给对象安装某个事件过滤器,一个是移除对应的事件过滤器。 void QObject::installEventFilter(QObject *filterObj) void QObject::removeEventFilter(QObject *obj) 下方代码使用 installEventFilter方法 给

前行之路还需前行 1万+

QT:事件传递

可被传递的事件可以通过accept/ignore进行标记,用于表示“接收”或是 “忽略”这个事件(缺省为接收)。 若事件hanlder调用accept,则事件不会继续被传递父控件。可以通过ignore或者再次传递事件,将事件传递给父控件。 void QWidget::keyPressEvent(QKeyEvent *event) { event->ignore(); } 或者 void QWidget::keyPressEvent(QKeyEvent *event) { .

AI.PLAY 809

QT程序实例(真实项目)

QT程序实例(真实项目):相当好的项目,功能比较完善.大家一起学习. QT程序实例(真实项目):相当好的项目,功能比较完善.大家一起学习.

学习记录——SIMPACK生成轨道谱文件的方法

生成轨道谱文件的方法,可以用于实测轨道谱导入和自制轨道谱导入仿真

weixin_51965897的博客 7804

MiniMax H3本地部署与ComfyUI集成实战:从环境配置到提示词优化

文本到视频生成是AI内容创作领域的关键技术,它基于扩散模型等深度学习原理,将自然语言描述转化为连贯的动态视觉序列。这项技术的核心价值在于大幅降低了视频制作的门槛,为短视频创作、概念可视化、教育内容生成等场景提供了高效工具。在实际工程实践中,成功部署和运行此类模型,如近期备受关注的MiniMax H3,需要精准处理环境配置、显存优化和提示词工程等环节。其中,解决“CUDA error: no kernel image is available”等版本兼容性问题,以及针对“8G显存”等有限资源进行参数调优,是确

weixin_33674976的博客 478

Windows Server 2019/2022 RDS 授权实战:3步激活许可证服务器,解决120天宽限期问题

本文详细介绍了Windows Server 2019/2022 RDS授权实战,提供3步激活许可证服务器的完整解决方案,解决120天宽限期问题。涵盖远程桌面授权服务器配置、许可证激活方法及组策略设置,确保企业合规使用远程桌面服务。

weixin_32705179的博客 982

别再死记硬背了!用LabVIEW串口通信的3个真实项目案例,手把手教你从调试到部署

本文通过3个真实项目案例,详细讲解LabVIEW串口通信从调试到部署的全过程。涵盖Arduino温湿度监控、西门子PLC Modbus通信以及高可靠性通信框架设计,提供实用技巧和常见问题解决方案,帮助工程师快速掌握LabVIEW串口通信的实战应用。

weixin_30485379的博客 523

Uniapp-APP后台保活插件(安卓后台保活)

Uniapp-APP后台保活插件(安卓后台保活)亲测有效!

weixin_57844432的博客 1万+

如何设计QR反激变换器

摘要:本文分析了基于GaN技术的PD适配器市场现状,重点探讨了准谐振反激变换器(QR Flyback)的工作原理及设计方法。文章首先介绍了反激变换器的三种工作模式(CCM、DCM、CRM/QR)及其特点,指出QR模式通过谷底开通技术能显著降低开关损耗。随后以65W适配器为例,详细阐述了变压器参数设计流程,包括匝比确定、原边电感计算和绕组匝数设计等关键步骤。文章强调QR反激变换器凭借高效率、小体积和低成本优势,已成为20W-65W PD适配器的主流拓扑方案,配合GaN技术进一步提升了功率密度和便携性。

m0_62868254的博客 1496

从二体运动到高精度轨道:STK与MATLAB联动的轨道外推算法演进史

本文探讨了轨道外推算法从二体运动到高精度轨道预报(HPOP)的演进历程,重点分析了STK与MATLAB协同仿真环境下的技术实现与应用。通过对比不同算法的精度与适用场景,展示了HPOP在卫星参数优化和轨道设计中的优势,为航天任务规划提供了高效解决方案。

weixin_29082143的博客 700

准备生日礼物

摘要: 题目要求统计某月份需要准备的员工生日礼物数量。输入包括目标月份、员工姓名列表和对应的生日列表(格式为Year/Month/Day)。需处理重复员工(以最后一次录入为准),统计该月生日的员工人数。示例1中5月有3名员工生日,输出3;示例2中10月有6名,输出6。解题关键在于使用哈希表去重(以员工姓名为键),拆分生日字符串提取月份进行匹配。代码实现(C++/Java/Python)均遵循以下步骤:读取输入、哈希去重、解析月份并统计目标月份人数。时间复杂度为O(n),空间复杂度O(n)。

面试高手的博客 298

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

上一篇: 1.2.1 Qt中事件是如何进行传递——叙述篇(上)
下一篇: 1.2.3 如何自己模拟发送事件消息
前行中的小猪
前行中的小猪 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄10年 4万+粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值