Qt 自定义event

本文章从属于  Qt实验室-CSDN博客系列

自定义事件携带数据

在某些情况下,可能需要通过事件携带一些额外的数据

可以通过自定义事件类来完成

一种实现方法是自定义一个QObject的子类,通过property来携带数据

class MyEvent : public QObject,public QEvent
{Q_OBJECT
public:explicit MyEvent(QEvent::Type type,QObject *parent = nullptr);
}

这里通过一个自定义的窗口来发送自定义的事件,通过 QApplication::sendEvent(parent,evn);将事件传递给它的父窗口

MyWidget::MyWidget(QWidget *parent): QWidget{parent}
{QTimer* timer=new QTimer(this);timer->setInterval(1000);connect(timer,&QTimer::timeout,[=]{MyEvent* evn=new MyEvent(QEvent::Type(QEvent::User+101),this);evn->setProperty("x","1");evn->setProperty("y","2");//sendEvent阻塞式发送信号//发出去的信号需要接收者通过event()进行处理QApplication::sendEvent(parent,evn);
//        QApplication::postEvent(parent,evn);});timer->start();
}
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{this->resize(500,300);MyWidget* center=new MyWidget(this);m_center=center;this->setCentralWidget(center);
}

在父窗口中通过event()去处理事件,并且获得事件中携带的数据 

bool MainWindow::event(QEvent *event)
{if(event->type()==QEvent::Type(QEvent::User+101)){//需要dynamic_cast,qobject_cast会编译不过
//        MyEvent* eve=qobject_cast<MyEvent*>(event);MyEvent* eve=dynamic_cast<MyEvent*>(event);qDebug()<<eve->property("x")<<","<<eve->property("y");qDebug()<<"in event :"<<"...";return true;}return true;
}

sendEvent阻塞式与postEvent队列式

这里,QApplication::sendEvent(parent,evn)后,会立刻进入MainWindow::event()中去进行处理;

QApplication::postEvent(parent,evn);则是将事件放入队列后,立刻就返回了

MyWidget::MyWidget(QWidget *parent): QWidget{parent}
{QTimer* timer=new QTimer(this);timer->setInterval(1000);connect(timer,&QTimer::timeout,[=]{MyEvent* evn=new MyEvent(QEvent::Type(QEvent::User+101),this);evn->setProperty("x","1");evn->setProperty("y","2");//sendEvent阻塞式发送信号//发出去的信号需要接收者通过event()进行处理
//        QApplication::sendEvent(parent,evn);QApplication::postEvent(parent,evn);qDebug()<<"after send";});timer->start();
}
bool MainWindow::event(QEvent *event)
{if(event->type()==QEvent::Type(QEvent::User+101)){QThread::sleep(2);//需要dynamic_cast,qobject_cast会编译不过
//        MyEvent* eve=qobject_cast<MyEvent*>(event);MyEvent* eve=dynamic_cast<MyEvent*>(event);
//        QObject* eve=qobject_cast<QObject*>(event);qDebug()<<eve->property("x")<<","<<eve->property("y");qDebug()<<"in event :"<<"...";return true;}return false;
}

以上代码中,当使用 QApplication::sendEvent(parent,evn);时,打印的顺序是:

QVariant(QString, "1") , QVariant(QString, "2")
in event : ...
after send

当使用QApplication::postEvent(parent,evn);时,打印的顺序是:

after send
QVariant(QString, "1") , QVariant(QString, "2")
in event : ...

简单分析一下,当使用sendEvent发送事件时,会立刻进入到MainWindow::event(),从而打印QVariant(QString, "1") , QVariant(QString, "2")
in event : ...

从MainWindow::event()结束返回后,再回到QApplication::sendEvent()后面打印after send

体现了sendEvent的阻塞模式;

而使用postEvent发送事件时,会将事件放入队列,然后postEvent()返回了,于是打印了after send

等到事件队列处理了事件的时候,才会打印QVariant(QString, "1") , QVariant(QString, "2")
in event : ...

体现了postEvent的队列模式

但这里尽管发送事件的频率是1次/s,处理事件的频率是1次/2s,而使用postEvent发送事件时打印的after send和in event : ...依然是一一对应的。

这是因为发送事件和处理事件在同一个线程内,只有处理完了一个事件之后,timer才会继续下一个计时。

假如发送事件和处理事件不再同一个线程内,那么after send和in event : ...将不会一一对应。

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

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

相关文章

赛宁网安获评“铸网-2023”江西省实网应急演练优秀支撑单位

近日&#xff0c;南京赛宁信息技术有限公司&#xff08;赛宁网安&#xff09;获得了江西省工业和信息化厅颁发的“优秀支撑单位”荣誉。 该荣誉表彰是对赛宁网安在“铸网-2023”江西省工业领域网络安全实网应急演练中提供全程技术支撑能力的认可。 本次实网应急演练聚焦工业企…

理疗养生服务预约小程序要如何做

不少人面对身体症状疼痛&#xff0c;往往不会选择去医院&#xff0c;而是去理疗养生馆&#xff0c;选择艾灸、拔罐、中药贴敷等方式治疗改善或减轻疼痛。随着人们对中医信赖度增强&#xff0c;理疗养生市场增长迅速。 而在增长的同时&#xff0c;我们也注意到理疗养生馆经营痛…

Android画个圆点状态灯

1、创建一个 XML 文件在 res/drawable 目录下&#xff08;默认为黑色&#xff09; <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/android"android:shape"oval"><…

Elasticsearch:检索增强生成 (Retrieval Augmented Generation -RAG)

作者&#xff1a;JOE MCELROY 什么是检索增强生成 (RAG) 以及该技术如何通过提供相关源知识作为上下文来帮助提高 LLMs 生成的响应的质量。 生成式人工智能最近取得了巨大的成功和令人兴奋的成果&#xff0c;其模型可以生成流畅的文本、逼真的图像&#xff0c;甚至视频。 就语…

搜维尔科技:ART最新的高级光学运动追踪相机

搜维尔科技&#xff1a;ART最新的高级光学运动追踪相机

UML软件建模软件StarUML mac中文版软件介绍

StarUML for mac是一款UML建模器&#xff0c;StarUML for mac提供了几个模版&#xff0c;帮助用户建立使用新的图表&#xff0c;是目前最流行的UML建模工具&#xff0c;给开发工作带来大大的便利。 StarUML mac软件介绍 StarUML 是一个流行的软件建模工具&#xff0c;用于创建…

解决Mac配置maven环境后,关闭终端后环境失效的问题(适用于所有终端关闭后环境失效的问题)

目录 问题的原因 解决方式一、每次打开终端时输入&#xff1a;"source ~/.bash_profile"&#xff0c;这个方式比较繁琐 解决方式二、我们终端输入"vim ~/.zshrc"打开".zshrc"文件 1、我们输入以下代码&#xff1a; 2、首先需要按 " i…

unity 使用Vuforia扫描实体物体交互

文章目录 前言一、Vuforia是什么&#xff1f;二、Unity导入Vuforia1.去Unity - Windows – Asset Store&#xff0c;搜vuforia engine&#xff0c;添加到我的资源2.从 Unity 的菜单 Assets -> Import package -> Custom Package 导入脚本&#xff0c;添加 Vuforia Engine…

javafx-启动main时获取pid,关闭windows窗口时杀掉pid

有时候发现&#xff0c;关掉了窗口&#xff0c;但是发现进程列表里面还有这个进程&#xff0c;因此在关闭的时候在kill一次代码可以参考 package sample.main;import javafx.application.Application; import javafx.event.EventHandler; import javafx.fxml.FXMLLoader; impo…

工作汇报怎么写?建议收藏

整体思路与模块&#xff1a; 背景/事件 成果展示 推动落实的方法论 收获与成长 存在的不足及改进措施 下一步工作安排 支持&#xff08;选&#xff09; 一、背景/事件 对于区分“功能性总结”和“应付性总结”&#xff0c;在背景/事件方面有一个关键点 是报告是否具有…

Python输出华氏-摄氏温度转换表

输入2个正整数lower和upper&#xff08;lower≤upper≤100&#xff09;&#xff0c;请输出一张取值范围为[lower&#xff0c;upper]、且每次增加2华氏度的华氏-摄氏温度转换表。 温度转换的计算公式&#xff1a;C5(F−32)/9&#xff0c;其中&#xff1a;C表示摄氏温度&#xf…

简洁高效的微信小程序分页器封装实践

前言 在现今的移动应用开发中&#xff0c;微信小程序已经成为了一个备受欢迎的平台。然而&#xff0c;随着应用的复杂性增加&#xff0c;数据的管理和加载成为了一个问题。本文将探讨微信小程序中的一个关键概念&#xff1a;封装分页器&#xff0c;它是提升小程序性能和用户体验…

Python实现WOA智能鲸鱼优化算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 鲸鱼优化算法 (whale optimization algorithm,WOA)是 2016 年由澳大利亚格里菲斯大学的Mirjalili 等提…

【Linux】-文件系统的详解以及软硬链接

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

AD输出光绘文件和工程文件

Altium Designer输出生产文件Gerber、IPC、NC Drill、坐标文件--AD_ad坐标文件_ltqshs的博客-CSDN博客上面这个链接里输出钻孔文件里&#xff0c;应该选摒弃前置0 Altium Designer(AD)软件使用记录04-AD设计文件输出汇总_ad文件-CSDN博客 这个也可以参考 【AD】输出生产文件_a…

Java异常处理(总结)

Error&#xff1a;Java虚拟机无法解决的严重问题。JVM系统内部错误、资源耗尽。如&#xff1a;StackOverFlowError、OOM。这种问题无法进行异常处理。Exception&#xff1a;除了 Error 以外的问题。可以进行异常处理。Exception分为&#xff1a;编译时异常、运行时异常。运行时…

说说你对React Router的理解?常用的Router组件有哪些?

一、是什么 react-router等前端路由的原理大致相同,可以实现无刷新的条件下切换显示不同的页面 路由的本质就是页面的URL发生改变时,页面的显示结果可以根据URL的变化而变化,但是页面不会刷新 因此,可以通过前端路由可以实现单页(SPA)应用 react-router主要分成了几个不…

香港和美国节点服务器的测试IP哪里有?

在选择服务器时&#xff0c;我们通常需要进行一些测试来评估其性能和稳定性。当然&#xff0c;这其中一个重要的测试指标就是服务器的 IP 地址。通过测试 IP 地址&#xff0c;我们可以了解到服务器所在地区以及网络连接质量等信息。作为香港及亚太数据中心领先服务商恒创科技&a…

docker简介和安装

0.前提 本文章意在告诉各位开发者学生有一个工具能够方便你未来的项目开发和部署&#xff0c;这也是我在给我留下一份备份&#xff0c;在我忘记的时候可以回头寻找。 1.docker简介 docker本身就有集装箱的意思。Docker: Accelerated Container Application Development Dock…

基于单片机智能浇花系统仿真设计

**单片机设计介绍&#xff0c; 基于单片机智能浇花系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能浇花系统可以实现自动化浇水、测土湿度和温度等功能&#xff0c;以下是一个基本的仿真设计步骤&am…