qt源码---事件系统之QCoreApplication

这篇具有很好参考价值的文章主要介绍了qt源码---事件系统之QCoreApplication。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上一节分析了qt和windows系统之间的消息的传递,本节着重看一下,qt内部的事件是如何传递的?

1.sendEvent函数

在使用的自定义事件时,有时需要手动抛出一个事件,常用的方式有2种,其一时阻塞式的sendEvent函数;其二是postEvent函数;sendEvent函数定义如下:

qt源码---事件系统之QCoreApplication,qt,开发语言

其主要是将spont设置为fasle,然后转入到notifyInternal2函数中执行处理;

qt源码---事件系统之QCoreApplication,qt,开发语言

其中self在QCoreApplicationPrivate构造函数中已被指定,所以不为空,if(!self && selfRequired)不会执行;

QInternal::activateCallbacks函数,会检测是否注册了事件回调函数,如果注册了对应的事件函数,会截获此事件;其对应的定义如下:

qt源码---事件系统之QCoreApplication,qt,开发语言

 由于在实践项目中没有用过此种方式,此处略过

接下来会通过QScopedScopeLevelCounter类将接收对象的scopeLevel变量加1,并在函数退出时,减一;此处猜测是qt标识循环层级使用的,实际是做什么用的,还不清楚;

接下来会转入doNotifity函数处理,notify函数最终也是转入doNotify函数中处理;

qt源码---事件系统之QCoreApplication,qt,开发语言

此处会检测接收对象和发送对象是否在同一个线程;并最终转入notify_helper函数中处理;

 qt源码---事件系统之QCoreApplication,qt,开发语言

 此处会判断接收的对象是否在主线程中,如果是在主线程中,会检测QCoreApplication的对象是否安装了事件过滤器,如果此事件被QCoreApplication事件过滤器检测到并被处理,并不会向下传递;

接下来会判断此接收对象上的事件过滤器是否处理此事件,如果此事件被处理则退出;

最后,进入接收对象自己的event函数,进行事件处理;

通过上述流程可以发现:1、event对象在事件传递过程中,没有执行删除等释放动作,其内存需要用户自己管理;2、sendEvent函数一直在执行函数的调用,并最终转到notify_helper函数中处理,所以其是阻塞式调用;3、事件的传递顺序,先被QCoreApplication对象拦截,接着被对象注册的事件过滤器拦截,最后执行自己的event函数;

2、postEvent函数

qt源码---事件系统之QCoreApplication,qt,开发语言

 qt源码---事件系统之QCoreApplication,qt,开发语言

首先判断接收对象是否为空,如果为空,删除event对象,并退出;

判断接收对象的线程是否被释放,如果接收对象所在的线程已被删除,则删除event对象,并退出;

如果接收对象被移动到其他线程中,再次检测新的线程是否被删除,如果新的线程已被删除,则删除event对象,并退出;

判断事件是否可以被压缩,即删除已经在postEventList中重复的事件,主要针对QTimerEvent事件、QDeferredDeleteEvent、QQuitEvent等事件;

qt源码---事件系统之QCoreApplication,qt,开发语言

 接下来,执行:qt源码---事件系统之QCoreApplication,qt,开发语言

 将QEvent对象放入QScopedPointer中,将receiver、event对象拼装成QPostEvent对象,并放入到QPostEventList中,如果中间出现异常,则event对象内存有QScopedPointer对象回收;

QPostEventList是根据priority优先级进行排序执行的;

接下来将event->posted置为true,postedEvents数量加1,并将canWait设置为false;

最后调用QAbstractEventDispatcher的wakeUp函数;wakeUp函数会调用WinAPI的PostMessage函数,投递一个WM_QT_SENDPOSTEDEVENTS事件,其会被processEvent函数捡取到,并最终转入QCoreApplicationPrivate中的sendPostedEvents函数处理(具体可以参考上一节);

qt源码---事件系统之QCoreApplication,qt,开发语言

 qt源码---事件系统之QCoreApplication,qt,开发语言

 首先判断receiver对象是否为空,是否跨线程执行?由于通过QAbstractEventDispatcher对象调用,其receiver对象为空,所以此处会跳过执行;

将recursion加1,防止递归调用;并判断postEventList列表中是否有事件,如果没有事件需要处理则退出;

接下来主要是从QPostEventList中取出事件,并调用QCoreApplication::sendEvent函数处理;

并且会在此处删除event对象,由QScopedPointer对象负责处理;

另外qt在处理取事件的过程中非常小心,考虑了很多异常情况

期间定义了CleanUp的类,主要是用来处理事件对象被处理后,清空事件列表中已经处理过的事件;

总结:

sendEvent函数:

1、event对象在事件传递过程中,没有执行删除等释放动作,其内存需要用户自己管理;

2、sendEvent函数一直在执行函数的调用,并最终转到notify_helper函数中处理,所以其是阻塞式调用;

3、事件的传递顺序,先被QCoreApplication对象拦截,接着被对象注册的事件过滤器拦截,最后执行自己的event函数;

postEvnet函数:

1、event对象会被保存在全局的postEventList列表中,由事件在处理时被释放;

2、postevent函数会将事件、receiver对象放到全局的QPostEventList列表中,并通过WINAPI的postmessage系统函数,通知QAbstractEventDispatcher类检索到,最终转入到sendPostedEvents函数中处理;

3、上一节已提到windows消息及qt自定义消息如何被检索的过程,所以可以判断出postevent函数的处理是异步的过程;

QCoreApplication类的主要内容已基本结束,下一节会着重介绍下定时器事件;文章来源地址https://www.toymoban.com/news/detail-633575.html

到了这里,关于qt源码---事件系统之QCoreApplication的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【QT】——事件处理系统

    目录 1.事件介绍 2.QT事件的产生 3.事件处理函数 3.1鼠标事件 3.2键盘事件 3.3窗口重绘事件 3.4窗口关闭事件 3.5窗口大小变化事件 4. 重写事件处理函数 QT 程序是事件驱动的, 程序的每个动作都是由内部某个事件所触发 。QT 事件的发生和处理 成为程序运行的主线,存在于程序整个

    2024年02月13日
    浏览(39)
  • C++ Qt开发:Charts折线图绑定事件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍 QCharts 折线图的常用方法及灵活运用。 在上一篇文章中笔者介绍了关于 QChart

    2024年02月04日
    浏览(47)
  • 【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角

    在探讨 Qt 的世界时,我们不仅是在讨论一种编程框架,更是在探索一种将复杂技术细节隐藏于幕后、让开发者专注于创造性工作的艺术形式。正如著名的计算机科学家 Edsger Dijkstra 所言:“简洁是复杂性的先决条件。” 在这一章节中,我们将探讨 Qt 事件机制的基础概念,这

    2024年02月22日
    浏览(52)
  • 【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.4 鼠标按下、移动、释放事件

    本章要实现的整体效果如下: QEvent::MouseButtonPress ​ 鼠标按下时,触发该事件,它对应的子类是 QMouseEvent QEvent::MouseMove ​ 鼠标移动时,触发该事件,它对应的子类是 QMouseEvent QEvent::MouseButtonRelease ​ 鼠标释放时,触发该事件,它对应的子类是 QMouseEvent 本节通过两个案例来讲

    2024年02月08日
    浏览(47)
  • 医院安全(不良)事件上报系统源码 不良事件报告平台源码 前后端分离,支持二开

    医院安全(不良)事件上报系统源码 系统定义: 规范医院安全(不良)事件的主动报告,增强风险防范意识,及时发现医院不良事件和安全隐患,将获取的医院安全信息进行分析反馈,并从医院管理体系、运行机制与规章制度上进行有针对性的持续改进。 以“医疗”、“护

    2024年02月09日
    浏览(39)
  • 医院不良事件报告系统源码带鱼骨图分析

    医院不良事件上报系统 通过 “事前的人员知识培训管理和制度落地促进”、“事中的事件上报和跟进处理”、 以及 “事后的原因分析和工作持续优化”,结合预存上百套已正在使用的模板, 帮助医院从对护理事件、药品事件、医疗器械事件、医院感染事件、输血事件、意

    2024年02月04日
    浏览(54)
  • 提升医院安全的关键利器——医院安全(不良)事件报告系统源码

    医院是人们寻求医疗服务和康复的场所,安全是医院运营的基石。然而,医疗过程中不可避免地会出现不良事件,如药物错误、手术事故等。为了及时发现、评估和解决这些问题,医院安全(不良)事件报告系统应运而生。本文将详细介绍这一系统的重要性、功能和优势。

    2024年02月08日
    浏览(38)
  • 06-5_Qt 5.9 C++开发指南_Splash 与登录窗口(MouseEvent鼠标事件;注册表;加密)

    一般的大型应用程序在启动时会显示一个启动画面,即 Splash 窗口。Splash 窗口是一个无边对话框,一般显示一个图片,展示软件的信息。Splash 窗口显示时,程序在后台做一些比较耗时的启动准备工作,Splash 窗口显示一段时间后自动关闭,然后软件的主窗口显示出来。Qt有一个

    2024年02月13日
    浏览(45)
  • 医疗安全不良事件管理系统源码(PHP+ vue+laravel)

    医疗安全不良事件管理系统全套源码 不良事件上报系统源码 不良事件 管理系统 帮助医院梳理建立不良事件上报与管理的一体化解决方案,包含上报内容、归口科室、上报流程及管理办法。提供面向医院的不良事件全过程管理平台,包含事件上报、事件处理、事件追踪、RC

    2024年02月06日
    浏览(58)
  • PHP语言B/S架构医院(安全)不良事件上报系统源码

    医院安全(不良)事件上报系统 采用无责的、自愿的填报不良事件方式,有效地减轻医护人员的思想压力,实现以事件为主要对象,可以自动、及时、实际地反应医院的安全、不良、近失事件的情况,更好地掌握不良事件的发生趋势,未及时采取适当的管理措施和流程、制度

    2024年02月03日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包