当前位置: 首页 > 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、调用过程

 

 

http://www.lryc.cn/news/19923.html

相关文章:

  • RecycleView详解
  • 【算法】最短路算法
  • < Linux > 进程间通信
  • 学习 Python 之 Pygame 开发魂斗罗(二)
  • 户籍管理系统测试用例
  • (三)代表性物质点邻域的变形分析
  • Stream操作流 练习
  • 【模拟集成电路】宽摆幅压控振荡器(VCO)设计
  • 《英雄编程体验课》第 13 课 | 双指针
  • DS期末复习卷(十)
  • QT+OpenGL模板测试和混合
  • 《英雄编程体验课》第 11 课 | 前缀和
  • Java学习--多线程2
  • 【Virtualization】Windows11安装VMware Workstation后异常处置
  • 第四章.神经网络—BP神经网络
  • 如何压缩RAR格式文件?
  • JS 执行机制 详解(附图)
  • 华为OD机试真题Java实现【 计算面积】真题+解题思路+代码(20222023)
  • 【JVM】运行时数据区与对象的创建流程
  • flutter- JSON解析框架使用方法json_serializable
  • 第十三届蓝桥杯国赛 C++ B 组 J 题——搬砖(AC)
  • Spring Cloud Nacos源码讲解(十)- Nacos服务端服务发现处理
  • C++ 修改程序进程的优先级(Linux,Windows)
  • 同步和异步promise
  • CHATGPT是新的“搜索引擎终结者”吗?百度是否慌了
  • 力扣-订单最多的客户
  • MyBatis学习笔记(六) —— MyBatis的各种查询功能
  • 2023年最新详细教程!手把手教你搭建Hexo + GitLab个人博客
  • centos7安装
  • java String类(超详细,含常用方法、面试题,内存图,案例)