qt源码--事件系统之QAbstractEventDispatcher
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函数的实现;
相关文章:

qt源码--事件系统之QAbstractEventDispatcher
1、QAbstractEventDispatcher内容较少,其主要是定义了一些注册接口,如定时器事件、socket事件、注册本地事件、自定义事件等等。其源码如下: 其主要定义了大量的纯虚函数,具体的实现会根据不同的系统平台,实现对应的方…...
深入了解Python中的os.path.join函数
深入了解Python中的os.path.join函数 1. 引言 在Python中,处理文件和目录路径是常见的任务。为了简化路径的拼接和操作,Python提供了os.path模块,其中的join函数是一个非常重要且常用的函数。本文将深入介绍os.path.join函数的用法和注意事…...
Node.js:execSync执行一个shell命令
默认输出是Buffer对象 const { execSync } require(child_process)let out execSync("echo hi") console.log(out); // <Buffer 68 69 0a>需要转为字符串 const { execSync } require(child_process)let out execSync("echo hi") console.log(…...

《入门级-Cocos2d 4.0塔防游戏开发》---第二课:游戏加载界面开发
目录 一、开发环境介绍 二、开发内容 2.1 修改窗口的大小。 2.2 添加加载场景相关代码 2.3 添加资源 三、显示效果 四、知识点 4.1 Sprite 4.2 定时器 一、开发环境介绍 操作系统:UOS1060专业版本。 cocos2dx:版本 环境搭建教程: 统信UOS下配…...
打卡力扣题目十二
#左耳听风 ARST 打卡活动重启# 目录 一、问题 二、解题方法一 三、解题方法二 关于 ARTS 的释义 —— 每周完成一个 ARTS: ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一个技术技巧 ● Share: …...

QT服务器练习
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化空间server new QTcpServer(this); }Widget::~Widget() {delete ui; }//启动服务器按钮对…...

Vcenter 创建 虚拟机配置 Thin Provision 模式 disk
介绍 在vCenter中选择虚拟磁盘格式通常也取决于您的需求和使用情况。 vSphere支持多种虚拟磁盘格式,以下是一些常见的格式: Thick Provision Lazy Zeroed:这是vSphere中的默认格式。它会预分配虚拟磁盘所需的存储空间,但只有在虚…...

初识mysql数据库之事务的概念及操作
目录 一、数据库多客户端访问问题 1. 数据库的CURD无限制带来的问题 2. 如何解决CURD导致的问题 二、事务的概念 1. 什么是事务 2. 事务的四个属性 3. mysql对事务的管理 4. 为什么会有事务 5. 事务的版本支持 三、事务的操作 1. 事务提交方式 2. 事务操作的准备工…...
MPL-2.0(Mozilla Public License 2.0)
MPL-2.0(Mozilla Public License 2.0)是一种开源软件许可证,由 Mozilla 组织于2012年发布,用于授权开源项目。MPL-2.0 是 MPL-1.1 许可证的继任版本,旨在更好地适应现代开源软件的发展和使用。 MPL-2.0 许可证的主要特…...
Qt+OpenCV+VTK在VS2017中配置路径
QtOpenCVVTK在VS2017中配置路径 《Qt环境配置》《OpenCV环境配置》《VTK环境配置》 《Qt环境配置》 包含目录: D:\Qt\Qt5.12.11\5.12.11\msvc2017_64\include D:\Qt\Qt5.12.11\5.12.11\msvc2017_64\include\QtWidgets D:\Qt\Qt5.12.11\5.12.11\msvc2017_64\include…...

线性代数(应用篇):第五章:特征值与特征向量、第六章:二次型
文章目录 第5章 特征值与特征向量、相似矩阵(一) 特征值与特征向量1.定义2.性质3.求解(1)具体型矩阵试根法、多项式带余除法:三阶多项式分解因式 (2)抽象型矩阵 (二) 相似1.矩阵相似(1)定义(2)性质 2.相似对角化(1)定义(2)相似对角化的条件(n阶矩阵A可相…...

Java8实战-总结9
Java8实战-总结9 Lambda表达式把Lambda付诸实践:环绕执行模式第1步:记得行为参数化第2步:使用函数式接口来传递行为第3步:执行一个行为第4步:传递Lambda 使用函数式接口PredicateConsumerFunction原始类型特化 Lambda表…...

大数据开发面试必问:Hive调优技巧系列一
Hive必问调优 Hive 调优拆解:Hive SQL 几乎是每一位互联网分析师的必备技能,相信很多小伙伴都有被面试官问到 Hive 优化问题的经历。所以掌握扎实的 HQL 基础尤为重要,hive优化也是小伙伴应该掌握的一项技能,本篇文章具体从hive建表优化、HQ…...

Jupyter Notebook 7重磅发布,新增多个特性!
本文分享Jupyter Notebook大版本v7.0.0更新亮点,及简单测试! 近日,Jupyter Notebook大版本v7.0.0更新,Jupyter Notebook 7基于JupyterLab,因此它包含了过去几年JupyterLab中添加的许多新功能和改进,部分亮…...

linux V4L2子系统——v4l2架构(1)之整体架构
概述 V4L(Video for Linux)是Linux内核中关于视频设备的API接口,涉及视频设备的音频和视频信息采集及处理、视频设备的控制。V4L出现于Linux内核2.1版本,经过修改bug和添加功能,Linux内核2.5版本推出了V4L2(…...

Qt信号与槽机制的本质
引入 对象与对象之间的通信有多个方式,如果我们要提供一种对象之间的通信机制。这种机制,要能够给两个不同对象中的函数建立映射关系,前者被调用时后者也能被自动调用。 再深入一些,两个对象如果都互相不知道对方的存在ÿ…...

Linux:入门学习知识及常见指令
文章目录 入门介绍操作系统的概念Linux机器的使用Linux上的指令 对文件知识的补充文件的定义和一些含义文件和目录的存储绝对路径和相对路径 ls指令pwd指令cd指令touch指令mkdir指令rmdir指令rm指令man指令cp指令mv指令cat指令more指令echo指令输出重定向 less指令find指令grep…...
K8s:Kubernetes 故障排除方法论
写在前面 博文内容为节译整理文中提到的工具大部分是商业软件,不是开源的,作为了解理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它…...

TCP 三次握手四次挥手浅析
大家都知道传输层中的TCP协议是面向连接的,提供可靠的连接服务,其中最出名的就是三次握手和四次挥手。 一、三次握手 三次握手的交互过程如下 喜欢钻牛角尖的我在学习三次握手的时候就想到了几个问题:为什么三次握手是三次?不是…...

【软件安装】MATLAB_R2021b for mac 安装
Mac matlab_r2021b 安装 下载链接:百度网盘 下载链接中所有文件备用。 我所使用的电脑配置: Macbook Pro M1 Pro 16512 系统 macOS 13.5 安装步骤 前置准备 无此选项者,自行百度 “mac 任何来源”。 1 下载好「MATLAB R2021b」安装文…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...