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

这篇具有很好参考价值的文章主要介绍了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.2.1 Qt中事件是如何进行传递——实例篇(下),Qt基础内容教程,qt,事件,event,eventFilter

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

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

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

图二:程序实际运行图

1.2.1 Qt中事件是如何进行传递——实例篇(下),Qt基础内容教程,qt,事件,event,eventFilter

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

1.2.1 Qt中事件是如何进行传递——实例篇(下),Qt基础内容教程,qt,事件,event,eventFilter


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

1.2.1 Qt中事件是如何进行传递——实例篇(下),Qt基础内容教程,qt,事件,event,eventFilter

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

到了这里,关于1.2.1 Qt中事件是如何进行传递——实例篇(下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序一对多个页面间传递数据进行通信,事件触发的实现方法

    在有些场景下,使用组件间通信或者组件和页面间通信并不可行。比如我需要只有一个websocket实例,并且需要向多个页面传递我接收到的消息。 下面的方法是一个页面向其它页面(触发事件)传递数据,其它页面也可以向这个页面传递数据。也就是可以互相传递。 缺点是,

    2024年02月07日
    浏览(47)
  • [Angular 基础] - 视图封装 & 局部引用 & 父子组件中内容传递

    之前的笔记: [Angular 基础] - Angular 渲染过程 组件的创建 [Angular 基础] - 数据绑定(databinding) [Angular 基础] - 指令(directives) 以上为静态页面,即不涉及到跨组件交流的内容 以下涉及到组件内的沟通,从这开始数据就“活”了 [Angular 基础] - 自定义事件 自定义属性 下面的例子依旧

    2024年02月22日
    浏览(38)
  • Vue 中change事件除了默认参数value ,如何传递自己的参数

    vue中@change事件除了传递value默认参数,如果需要传自己的参数myprops 是有两种方法: 但是这种方式分场景,如果你的myprops在data中定义好的那么就可以传过去,如果myprops参数是像for循环里的每个item项目,那就报错,提示你在data或者method中定义该参数或者方法。 这种方法任何

    2024年02月11日
    浏览(46)
  • FPGA如何根据原理图进行约束------(基础详细教程)

    目录 一、约束时钟引脚(如CLK) 二、约束与按键相连引脚(如RST) 首先我们需要找到晶振,时钟大多数由晶振产生。 打开原理图,晶振一般在原理图中使用大写“X”或“Y”开头。 1、单端时钟 下图是一个单端时钟,时钟频率一般会在原理图中标明。(若没有在原理图中标出

    2024年02月02日
    浏览(34)
  • 【12JavaScript 事件】掌握JavaScript事件:详细教程、实例演示,打造交互动感网页!

    JavaScript事件是指页面或元素上发生的交互动作,例如点击按钮、鼠标移动、键盘输入等。了解和处理事件是构建交互式Web应用程序的重要基础。本教程将详细介绍JavaScript事件的基本概念、事件处理程序、事件类型以及常见的事件用法。 事件处理程序是处理事件的函数,它会

    2024年02月08日
    浏览(68)
  • [C++] 基础教程 - 如何使用google test进行单元测试

    https://download.csdn.net/download/u011775793/88601877 单元测试是一种软件测试方法,用于测试代码中的最小可测试单元。在软件开发中,我们通常将代码分解为多个模块或类,每个模块或类都有自己的功能和行为。单元测试的目的是确保每个模块或类都能正常工作,不会影响其他模块或

    2024年02月04日
    浏览(48)
  • react自定义组件间的传值,if..else..判断,for循环(嵌套map使用),点击事件(Onclick),页面上事件实事传递参数(基础版)

    9.自定义组件间的传值 10.if..else..判断 11.for循环(嵌套map使用) 12.点击事件(Onclick) 13.页面上事件实事传递参数 14.关于export default function App()与export function App()的区别    export default不需要{}      import  Gallery from \\\'./Gallery.js\\\';    export function需要{}       import {Gallery} from \\\'./Galler

    2024年01月17日
    浏览(43)
  • python是如何进行参数传递的?

    在分析python的参数传递是如何进行的之前,我们需要先来了解一下,python变量和赋值的基本原理,这样有助于我们更好的理解参数传递。 python变量以及赋值 数值 从几行代码开始 我们先将1赋值给a,也就是a指向了1这个对象, 在python中一切皆对象 。接着b=a,则表示让b也指向

    2024年02月14日
    浏览(48)
  • 小程序中如何进行数据传递和通信

    103. 小程序中如何进行数据传递和通信? 1. 使用页面参数传递数据: 在小程序中,可以通过页面参数来传递数据。当跳转到一个新页面时,可以将需要传递的数据作为参数传入,然后在目标页面的onLoad函数中获取参数。 示例代码: 第一个页面中的跳转代码: 第二个页面中的

    2024年02月11日
    浏览(40)
  • Chrome扩展程序是如何进行消息传递的

    大家好,我是 dom 哥。这是我关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星。 一个复杂的 Chrome 扩展程序通常由 content_scripts , background , action popup , side panel , options page , devtools 等部分组成,这些部分所负责的功能各不相同,所处的运行环境各不相同,所能

    2024年02月04日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包