qt源码--事件系统之QAbstractEventDispatcher

news2024/11/13 15:43:59

1、QAbstractEventDispatcher内容较少,其主要是定义了一些注册接口,如定时器事件、socket事件、注册本地事件、自定义事件等等。其源码如下:

 其主要定义了大量的纯虚函数,具体的实现会根据不同的系统平台,实现对应的方法;我主要使用windows编程,其主要是在QEventDispatcherWin32中实现;QEventDispatcherWin32对象的创建主要是在QCoreApplicationPrivate中创建,其代码如下:

另外:QEventDispatcherWin32对象,一个线程中只有一个事件分配器,QThreadData中会保存QAbstractEventDispatcher对象。

2、QEventDispatcherWin32源码中主要实现:a.定时功能(由于定时功能需要使用系统时钟,应该会调用winAPI函数); b.socket事件;c.qt和windows系统之间的事件交互;

 QEventDispatcherWin32的构造函数体为空,直接忽略;

上一节介绍QCoreApplication类时,发现其调用exec函数最终会定位到QAbstractEventDispatcher的processEvents函数,其是QAbstractEventDispatcher最重要的函数之一;

 

 

 由于internalHwnd为空,所以会先调用createInternalHwnd函数,其中定义了windows系统和qt系统交互的方式;

 qt_create_internal_window中创建了一个看不见的windows窗口,并注册其事件监听回调函qt_internal_proc;

 此函数主要是调用TranslateMessage(&msg);及 DispatchMessage(&msg);函数时执行此方法;当消息类型为WM_QT_SENDPOSTEDEVENTS类型时,调用sendPostedEvents函数;

注:sendPostedEvents函数,会调用到QCoreApplicationPrivate类中的sendPostedEvents函数,从而转到qt内部的事件处理。

installMessageHook()函数,定义了WH_GETMESSAGE类型的钩子函数,其主要时监听peekMessage函数的返回值或者监听键盘、鼠标等输入事件;qt_GetMessageHook函数为对应的钩子函数,其实现如下:

其主要是检测消息队列中是否还存在有定时器事件、鼠标、键盘等输入事件的消息,如果不存在,会投递一个WM_QT_SENDPOSTEDEVENTS消息;

继续分析processEvents函数中的剩余内容:

此处主要是检测消息对列中是否有消息需要处理,如果存在消息,取出队列中的消息;

如果存在对应的消息,

 检测消息类型,如果是WM_QT_SENDPOSTEDEVENT类型,则将对应的标志位seenWM_QT_SENDPOSTEDEVENTS标志位置为true;如果为WM_TIMER事件类型,检测是否

已被处理过,如果处理过,直接跳过进入下次循环;如果没有处理加入processedTimers列表中,并稍后会被处理;

检测事件类型是否为WM_QUIT事件,如果是WM_QUIT事件则直接退出;

 检测本地事件过滤器是否处理此事件,如果没有处理则翻译事件、派发事件,并最终转入到qt_internal_proc函数中处理;

 以上部分代码,暂时没有看太懂,后续会接着研究。

至此QAbstractEventDispatcher最重要的processEvent函数已分析完毕;

总结:

1、qt通过注册一个隐藏的windows窗体类(主要时qt_internal_proc钩子函数),接收windows系统中的消息事件,并调用QCoreApplicationPrivate类中的sendPostedEvent函数,切入到qt的事件循环中;

2、qt通过processEvents函数不断捡取windows系统中的消息、自定义消息,并通过windowsAPI中的TranslateMessage函数翻译消息,DispatchMessage派发消息,将事件转入到qt_internal_proc中;

注:关于定时器、socket等事件会放到后续中分析,下一节会切入到QCoreApplication中分析qt内部的事件循环是如何处理的,主要是熟知的sendEvent、postEvent函数的实现;

         

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

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

相关文章

AD21原理图的高级应用(五)自定义原理图模板及调用

(五)自定义原理图模板及调用 1.创建原理图模板2.调用原理图模板 1.创建原理图模板 利用 Altium Designer 软件在原理图中创建自己的模板,可以在图纸的右下角绘制一个表格用于显示图纸的一些参数,例如文件名、作者、修改时间、审核者、公司信息、图纸总数…

建造者设计模式 + 高阶函数 => DSL

该设计模式适用于创建复杂对象,该复杂对象通常是由各个部分的子对象用一定的算法或者步骤构成,针对每个子对象内部算法和步骤通常是稳定的,但是该复杂对象的确实由于不同的需求而选择使用不同的子对象进行组装。对于构建该复杂的对象&#xf…

Vue2 第六节 key的作用与原理

(1)虚拟DOM (2)v-for中的key的作用 一.虚拟DOM 1.虚拟DOM就是内存中的数据 2.原生的JS没有虚拟DOM: 如果新的数据和原来的数据有重复数据,不会在原来的基础上新加数据,而是重新生成一份 3. Vue会有虚拟…

结构方程模型的绘制

模型的绘制是我们最终呈现出的一个结果 所以说这个课程主要关注的有两点 第一点就是模型图的绘制 第二点就是结果的解释 关于中间计算过程和背后的理论的一个结果 在本文章的所有的讲解过程中 只注重模型图的绘制方法 如何高效的绘制出所需要的一个模型图 同时能够调整…

【小吉带你学Git】Git分支

🎊专栏【Git】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题🥰 文章目录 🤖概述🍔什么是分支🍔使用分支的好处&am…

百万QPS系统如何设计?

一、关系链业务简介 从主站业务角度来看,关系链指的是用户A与用户B的关注关系。以关注属性细分,以关注(订阅)为主,还涉及拉黑、悄悄关注、互相关注、特别关注等多种属性或状态。目前主站关系链量级较大,且还…

九、HAL_IWDG独立看门狗的使用

1、开发环境 (1)Keil MDK: V5.38.0.0 (2)STM32CubeMX: V6.8.1 (3)MCU: STM32F407ZGT6 2、IWDG简介 (1)IWDG即独立看门狗。 (2)看门狗本质上是一个定时器,设置一个时间,时间到即让程序复位。所以需要在在时间未到之前重置定时器,也就是喂…

线性表详细讲解

2.1 线性表的定义和特点2.2 案例引入2.3 线程表的类型定义2.4 线性表的顺序表示和实现2.4.1 线性表的顺序存储表示2.4.2 线性表的结构类型定义2.4.3 顺序表基本操作的实现2.4.4 顺序表总结 2.5 线性表的链式表示和实现2.5.1 线性表的链式存储表示2.5.2 单链表的实现&#xff08…

ARM裸机-3

1、嵌入式和单片机的区别 1.1、芯片平台 主流的单片机平台:51、PIC、STM32、AVR、MSP430等 主流的嵌入式平台:ARM、PPC、MIPS 1.2、资源、价格、应用领域 单片机片上资源有限、价格低、应用领域多为小家电、终端设备等。 嵌入式系统片上资源丰富、价格…

数据库连接及使用Statement对象完成CRUD

一、数据库连接: 二、使用Statement对象完成CRUD: 1、插入: 2、删除 3、修改 4、查询 三、ORM对象关系映射

数据结构:顺序表详解

数据结构:顺序表详解 一、 线性表二、 顺序表概念及结构1. 静态顺序表:使用定长数组存储元素。2. 动态顺序表:使用动态开辟的数组存储。三、接口实现1. 创建2. 初始化3. 扩容4. 打印5. 销毁6. 尾插7. 尾删8. 头插9. 头删10. 插入任意位置数据…

pytorch 中 view 和reshape的区别

在 PyTorch(一个流行的深度学习框架)中, reshape 和 view 都是用于改变张量(tensor)形状的方法,但它们在实现方式和使用上有一些区别。下面是它们之间的主要区别: 实现方式: reshap…

13年测试经验,性能测试-压力测试指标分析总结,看这篇就够了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 一般推荐&#xf…

Jmeter环境变量配置及测试

上图是Windows版本的测试结果。 Windows系统: win11:“此电脑”——鼠标右键“属性”——“高级系统设置”——“环境变量” 1.1 新建“系统变量”:JMETER_HOME JMETER_HOME变量值为解压后的jmeter路径,如: D:\apach…

AD21原理图的高级应用(三)原理图多通道的应用

(三)原理图多通道的应用 在很多大型的设计过程中,我们可能会遇到需要重复使用某个图纸,如果使用常规的复制粘贴,虽然可以达到设计要求,但原理图的数量将会变得庞大而烦琐。Altium Designer 支持多通道设计。 多通道设…

数字图像处理(番外)图像增强

图像增强 图像增强的方法是通过一定手段对原图像附加一些信息或变换数据,有选择地突出图像中感兴趣的特征或者抑制(掩盖)图像中某些不需要的特征,使图像与视觉响应特性相匹配。 图像对比度 图像对比度计算方式如下: C ∑ δ δ ( i , j …

数学学习——最优化问题引入、凸集、凸函数、凸优化、梯度、Jacobi矩阵、Hessian矩阵

文章目录 最优化问题引入凸集凸函数凸优化梯度Jacobi矩阵Hessian矩阵 最优化问题引入 例如:有一根绳子,长度一定的情况下,需要如何围成一个面积最大的图像?这就是一个最优化的问题。就是我们高中数学中最常见的最值问题。 最优化…

【C++进阶:哈希--unordered系列的容器及封装】

本课涉及到的所有代码都见以下链接,欢迎参考指正! practice: 课程代码练习 - Gitee.comhttps://gitee.com/ace-zhe/practice/tree/master/Hash unordered系列关联式容器 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,在…

React井字棋游戏官方示例

在本篇技术博客中,我们将介绍一个React官方示例:井字棋游戏。我们将逐步讲解代码实现,包括游戏的组件结构、状态管理、胜者判定以及历史记录功能。让我们一起开始吧! 项目概览 在这个井字棋游戏中,我们有以下组件&am…

交叉编译工具链的安装、配置、使用

一、交叉编译的概念 交叉编译是在一个平台上生成另一个平台上的可执行代码。 编译:一个平台上生成在该平台上的可执行文件。 例如:我们的Windows上面编写的C51代码,并编译成可执行的代码,如xx.hex.在C51上面运行。 我们在Ubunt…