当前位置: 首页 > news >正文

qt源码--信号槽

本篇主要从Qt信号槽的连接、断开、调用、对象释放等方面展开;

1.信号建立连接过程

connect有多个重载函数,主要是为了方便使用者,比较常用的有2种方式:

a. QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);

b. QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));

 a方式对应的源码如下:

 

 

SIGNAL、SLOT对应的宏定义:

所以以上代码展开后为:QObject::connect(&timer, "2timeout()", &loop, "1quit()");

此函数除了此部分外,其他均是根据函数参数查找到信号、槽在sender、receiver的QMetaObject中的偏移量,特别需要注意的地方是链接参数使用Qt::QueuedConnection时,会检测参数对应的类型:

 queuedConnectionTypes函数源码如下:

 当时用自定义类型时,除了需要使用Q_DECLARE_METATYPE及qRegisterMetaType外,还需而外注意传参类型的完全匹配,即如果参数类型const Custom &时,qRegisterMetaType则对应为:qRegisterMetaType<const Custom &>(),主要原因是按照字符串进行匹配,否则会打印Cannot queue arguments of type ‘xxx’,Make sure ‘xxx’ is registered using qRegisterMetaType警告。

接下来主要看一下QMetaObjectPrivate::connect函数;

 其信号与槽主要是通过QObjectPrivate::Connection结构进行存储,其对应的源码如下:

 

 而外需要注意的是以上标记红色框的部分:

其信号和槽的连接过程对应3个链表:

1、QObjectConnectionListVector *connectionLists顺序列表管理每一个信号对应的Connection对象

2、Connection *nextConnectionList管理每一个信号对应的多个接收者,即一个信号可以绑定多个对象

3、Connection *senders和Connection *next,Connection **prev用来管理每一个信号对应的多个发送对象,即一个类有多个对象,每个对象都有可能发送此信号

 基本上链表关系如上所示,其addConnection的过程就是建立3个链表之间的关系,如果连接类型是Qt::UniqueConnection,则指挥建立一次连接

 此函数剩余部分为构建Connection对象,并使用q指针,建立链表连接

 

 QObjectConnectionListVector对象会根据信号在对象中的绝对偏移量动态扩展其大小,即申请顺序链表;

每次建立连接过程,会检测下链表,确认是否需要清除接收对象为空的对象;

connectedsignals采用了简单算法记录其信号是否建立连接;

2.信号断开过程:

其主要是通过disconnectHelper函数来断开连接

其主要是将receiver指针更改为空指针,并修改senders链表;

3、调用过程

 

 

相关文章:

qt源码--信号槽

本篇主要从Qt信号槽的连接、断开、调用、对象释放等方面展开&#xff1b; 1.信号建立连接过程 connect有多个重载函数&#xff0c;主要是为了方便使用者&#xff0c;比较常用的有2种方式&#xff1a; a. QObject::connect(&timer, &QTimer::timeout, &loop, &am…...

RecycleView详解

listview缓存请看: listview优化和详解RecycleView 和 ListView对比&#xff1a;使用方法上ListView&#xff1a;继承重写 BaseAdapter&#xff0c;自定义 ViewHolder 与 converView优化。RecyclerView: 继承重写 RecyclerView.Adapter 与 RecyclerView.ViewHolder。设置 Layou…...

【算法】最短路算法

&#x1f600;大家好&#xff0c;我是白晨&#xff0c;一个不是很能熬夜&#x1f62b;&#xff0c;但是也想日更的人✈。如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下&#x1f440;白晨吧&#xff01;你的支持就是我最大的动力&#xff01;&#x1f4…...

< Linux > 进程间通信

目录 1、进程间通信介绍 进程间通信的概念 进程间通信的本质 进程间通信的分类 2、管道 2.1、什么是管道 2.2、匿名管道 匿名管道的原理 pipe函数 匿名管道使用步骤 2.3、管道的读写规则 2.4、管道的特点 2.5、命名管道 命名管道的原理 使用命令创建命名管道 mkfifo创建命名管…...

学习 Python 之 Pygame 开发魂斗罗(二)

学习 Python 之 Pygame 开发魂斗罗&#xff08;二&#xff09;魂斗罗的需求开始编写魂斗罗1. 搭建主类框架2. 设置游戏运行遍历和创建窗口3. 获取窗口中的事件4. 创建角色5. 完成角色更新函数魂斗罗的需求 魂斗罗游戏中包含很多个物体&#xff0c;现在要对这些物体进行总结 类…...

户籍管理系统测试用例

目录 一、根据页面的不同分别设计测试用例 登录页面 用户信息列表 用户编辑页面 用户更新页面 二、根据目的不同分别设计测试用例 一、根据页面的不同分别设计测试用例 上图是针对一个网站的测试&#xff0c;按照页面的不同分别来设计对应的测试用例。 登录页面 用户信息列…...

(三)代表性物质点邻域的变形分析

本文主要内容如下&#xff1a;1. 伸长张量与Cauchy-Green 张量2. 线元长度的改变2.1. 初始/当前构型下的长度比2.2. 主长度比与 Lagrange/Euler 主方向2.3. 初始/当前构型下任意方向的长度比3. 线元夹角的改变4. 面元的改变5. 体元的改变1. 伸长张量与Cauchy-Green 张量 由于变…...

Stream操作流 练习

基础数据&#xff1a;Data AllArgsConstructor NoArgsConstructor public class User {private String name;private int age;private String sex;private String city;private Integer money; static List<User> users new ArrayList<>();public static void m…...

【模拟集成电路】宽摆幅压控振荡器(VCO)设计

鉴频鉴相器设计&#xff08;Phase Frequency Detector&#xff0c;PFD&#xff09;前言一、VCO工作原理二、VCO电路设计VCO原理图三、压控振荡器&#xff08;VCO&#xff09;测试VCO测试电路图瞬态测试&#xff08;1&#xff09;瞬态输出&#xff08;2&#xff09;局部放大图&a…...

《英雄编程体验课》第 13 课 | 双指针

文章目录 零、写在前面一、最长不重复子串1、初步分析2、朴素算法3、优化算法二、双指针1、算法定义2、算法描述3、条件1)单调性2)时效性三、双指针的应用1、前缀和问题2、哈希问题3、K 大数问题零、写在前面 该章节节选自 《夜深人静写算法》,主要讲解最基础的枚举算法 ——…...

DS期末复习卷(十)

一、选择题(24分) 1&#xff0e;下列程序段的时间复杂度为&#xff08; A &#xff09;。 i0&#xff0c;s0&#xff1b; while (s<n) {ssi&#xff1b;i&#xff1b;} (A) O(n^1/2) (B) O(n ^1/3) © O(n) (D) O(n ^2) 12…xn xn^1/2 2&#xff0e;设某链表中最常用的…...

QT+OpenGL模板测试和混合

QTOpenGL模板测试和混合 本篇完整工程见gitee:QtOpenGL 对应点的tag&#xff0c;由turbolove提供技术支持&#xff0c;您可以关注博主或者私信博主 模板测试 当片段着色器处理完一个片段之后&#xff0c;模板测试会开始执行。和深度测试一样&#xff0c;它可能会丢弃片段&am…...

《英雄编程体验课》第 11 课 | 前缀和

文章目录 零、写在前面一、概念定义1、部分和2、朴素做法3、前缀和4、前缀和的边界值5、边界处理6、再看部分和二、题目描述1、定义2、求解三、算法详解四、源码剖析五、推荐专栏六、习题练习零、写在前面 该章节节选自 《算法零基础100讲》,主要讲解最基础的算法 —— 前缀和…...

Java学习--多线程2

2.线程同步 2.1卖票【应用】 案例需求 某电影院目前正在上映国产大片&#xff0c;共有100张票&#xff0c;而它有3个窗口卖票&#xff0c;请设计一个程序模拟该电影院卖票 实现步骤 定义一个类SellTicket实现Runnable接口&#xff0c;里面定义一个成员变量&#xff1a;privat…...

【Virtualization】Windows11安装VMware Workstation后异常处置

安装环境 Windows 11 专业版 22H2 build 22621.1265 VMware Workstation 17 Pro 17.0.0 build-20800274 存在问题 原因分析 1、BIOS未开启虚拟化。 2、操作系统启用的虚拟化与Workstation冲突。 3、操作系统启用内核隔离-内存完整性保护。 处置思路 1、打开“资源管理器”…...

第四章.神经网络—BP神经网络

第四章.神经网络 4.3 BP神经网络 BP神经网络(误差反向传播算法)是整个人工神经网络体系中的精华&#xff0c;广泛应用于分类识别&#xff0c;逼近&#xff0c;回归&#xff0c;压缩等领域&#xff0c;在实际应用中&#xff0c;大约80%的神经网络模型都采用BP网络或BP网络的变化…...

如何压缩RAR格式文件?

RAR是我们日常生活工作中经常用到的压缩文件格式之一&#xff0c;那么RAR文件如何压缩呢&#xff1f; 不管压缩哪种格式的压缩文件&#xff0c;我们都需要用到压缩软件。针对RAR格式&#xff0c;我们可以选择最常见的WinRAR&#xff0c;当然如果有同样适用于RAR格式的压缩软件…...

JS 执行机制 详解(附图)

一、JS是单线程JS语言的一大特点就是单线程&#xff0c;也就是说&#xff0c;同一个时间只能做一件事。这是JS这门脚本语言诞生的使命所致——用来处理页面中用户的交互&#xff0c;以及操作DOM而诞生的。单线程就意味着&#xff0c;所有任务需要排队&#xff0c;前一个任务结束…...

华为OD机试真题Java实现【 计算面积】真题+解题思路+代码(20222023)

计算面积 绘图机器的绘图笔初始位i在原点(0.0)。 机器启动后其绘图笔按下面规则绘制直线: 1 )尝试沿着横向坐标轴正向绘制直线,直到给定的终点值E, 2 )期间可通过指令在纵坐标轴方向进行偏移。井同时绘制直线,偏移后按规则1绘制直线;指令的格式为X offsetY。表示在横坐标X…...

【JVM】运行时数据区与对象的创建流程

4、运行时数据区 4.1、运行时数据区介绍 运行时数据区也就是JVM在运⾏时产生的数据存放的区域&#xff0c;这块区域就是JVM的内存区域&#xff0c;也称为JVM的内存模型——JMM 堆空间&#xff08;线程共享&#xff09;&#xff1a;存放new出来的对象 元空间&#xff08;线程共…...

如何用MicroSIP实现远程办公通话?2024最新SIP协议设置指南

2024远程办公通话实战&#xff1a;MicroSIP高级配置与网络优化全攻略 远程办公已成为现代企业运营的标配&#xff0c;而稳定高效的语音通信系统则是团队协作的基石。作为一款轻量级开源SIP客户端&#xff0c;MicroSIP凭借其低延迟、高兼容性和零成本优势&#xff0c;正在成为中…...

嵌入式STM32开发者的Gitee协作指南:如何用.gitignore管好你的Hex和工程文件

嵌入式STM32开发者的Gitee协作指南&#xff1a;如何用.gitignore管好你的Hex和工程文件 在嵌入式开发领域&#xff0c;STM32系列微控制器的项目开发往往伴随着大量中间文件的生成——从Keil MDK编译产生的.hex、.axf&#xff0c;到STM32CubeIDE自动创建的Debug文件夹&#xff0…...

微信QQ防撤回神器:RevokeMsgPatcher 2.1 终极使用教程

微信QQ防撤回神器&#xff1a;RevokeMsgPatcher 2.1 终极使用教程 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitcode.co…...

BG3 Mod Manager:智能模组管理工具让博德之门3模组体验升级

BG3 Mod Manager&#xff1a;智能模组管理工具让博德之门3模组体验升级 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. This is the only official source! 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager 博德之门3作为一款备受欢迎的…...

AI学习路线及建议

1.python快速入门&#xff08;边用边学&#xff0c;建议3天&#xff09; 2.人工智能必备数学的基础&#xff08;边用边学&#xff0c;建议3天&#xff09; 3.机器学习&#xff08;找工作面试考点&#xff0c;临面试前晚一点刷&#xff09; 数据分析&#xff1a;短期找工作 ML/D…...

补个基础:闭包和this指针调用

//定义了一个普通的函数 const search()>{console.log(search) } //定义了一个防抖函数 function debounce(fn,delay){let timer nullreturn (...args)>{clearTimeout(timer)timersetTimeout(()>{//为什么要apply&#xff0c;改变指针指向fn.apply(this,args)console.…...

2025届必备的六大AI辅助写作神器解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 处于人工智能技术基础之上的智能辅助系统&#xff0c;是可给学术研究者送去高效、规范的开题…...

高效安全的网页资源提取方案:猫抓开源工具的技术实现与专业应用

高效安全的网页资源提取方案&#xff1a;猫抓开源工具的技术实现与专业应用 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字化时代&#xff…...

translategemma-4b-it优化升级:Ollama部署后提升翻译质量的4个技巧

translategemma-4b-it优化升级&#xff1a;Ollama部署后提升翻译质量的4个技巧 你已经成功用Ollama部署了translategemma-4b-it&#xff0c;看着它把图片里的英文变成中文&#xff0c;是不是觉得挺神奇的&#xff1f;但用了几次后&#xff0c;你可能会发现一些问题&#xff1a…...

Comsol 脉冲激光诱导等离子体仿真模型:探索微观世界的奇妙之旅

Comsol脉冲激光诱导等离子体仿真模型 利用脉冲激光作为热源&#xff0c;在氩气环境中诱导产生等离子体&#xff0c;主要体现出等离子体的密度、等离子体温度等参数 可以为激光诱导等离子体提供准确的参考在科研与工程领域&#xff0c;对脉冲激光诱导等离子体的深入研究有着举足…...