目录
前言
最近做一个项目的过程中遇到一个问题:在QThread和phread_create各自创建了一个QObject对象,两个对象之间的的信号只有一个方向能通。在开始阅读之前先抛出三个问题,大家可以带着问题来继续阅读:1、可能是哪个方向的信号->槽 不通呢?2、为什么会不通呢?3、应该怎么解决呢?
最近做项目过程中遇到一个问题:QT的信号和槽之间连接成功了,但是发信号后绑定的槽接收不到!
在两个线程中创建得到的两个QObject对象的信号和槽绑定成功后,竟然只能实现单向的连通!然后就开始一顿分析,为了解决这个问题,笔者做了很多的测试,也逼着自己把QT长长的一坨信号、槽实现corelib代码快速浏览了一遍!
原理性的东西
真正解决问题需要把原理搞清楚。
QT实现信号和槽的原理大概是这样的:一个完整的信号和槽之间建立工作关系分为三个阶段,第一阶段是连接的过程,第二阶段是调用的过程,第三阶段就是分发的过程;三个阶段的过程后续补充详细说明,每一个过程都比较长,后续考虑新增文章专门说明分析或者更新补充,这里概要说明。
- 第一阶段:connect方法将signal/slot的方法字符串进行管理并绑定到对应的send/receive对象的元对象重要成员上;
- 第二阶段:发送信号接口会进入元对象的acivate接口,接下来会进入qt_corelib的动态库中,主要完成跳转到特定对象上完成查找绑定的方法;这个过程中会涉及线程信息的判断,基于该设置判断值我们对这个信号的处理会跳转到不同的分支:1、Direct 调用