QT信号槽实现分析

1.宏定义

qt中引入了MOC来反射,编译阶段变成 MOC–>预处理–>编译–>汇编–>链接

1-1、Q_OBJECT

这个宏定义了一系列代码,包括元对象和处理的函数

#define Q_OBJECT \public: \QT_WARNING_PUSH \Q_OBJECT_NO_OVERRIDE_WARNING \static const QMetaObject staticMetaObject; \virtual const QMetaObject *metaObject() const; \virtual void *qt_metacast(const char *); \virtual int qt_metacall(QMetaObject::Call, int, void **); \QT_TR_FUNCTIONS \private: \Q_OBJECT_NO_ATTRIBUTES_WARNING \Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, 		QMetaObject::Call, int, void **); \QT_WARNING_POP \struct QPrivateSignal {}; \QT_ANNOTATE_CLASS(qt_qobject, "")

1-2、signal slot emit

从如下得知,slot和emit只是作一个修饰而已,本身为空没有任何作用,signal也只是声明为pulic

#define signal public
#define slot
#define emit

1-2、qt4中诞生的SIGANL SLOT

可以看到这两个宏也只是把我们输入的函数转成了字符串,后续去匹配

#define SIGANL "2"#a
#define SLOT "1"#a

我们去VS项目–属性–C/C+±-预处理器–预处理文件生成选择:是
发现预编译后宏展开如下。即验证上述
在这里插入图片描述

2.信号槽规则

1.信号的参数可以比槽多,反之不行,信号槽可以一对一,一对多,多对一

2.槽函数执行的顺序是按连接时的顺序依次执行的,重复connect会导致多次执行

connect(obj, SIGNAL(sig1), this, SLOT(slot1()));
connect(obj, SIGNAL(sig1), this, SLOT(slot2()));
那么sig1发出时,先执行槽函数 slot1, 再执行槽函数 slot2

3.如果用SIGNAL方式connect,可以不需要作用域,因为上面说过了,他把他转为了字符串。目前遇到好处是可以绑定多态信号槽,而无需引入派生类文件。坏处是不会进行检查,编译时才报warning

qt5的方式connect就需要,好处是写代码时就会进行参数匹配检查

4.连接可以被disconnect删除

5.注意connect第五个参数,详细可以见QT第五个参数,举两个常见例子
在子线程抛出来信号,主线程若不绑定为QueuedConnection或BlockingQueuedConnection,会接收不到。
如果用BlockingQueuedConnection,信号槽不能在同一个线程因为发送完信号后发送者所在线程会阻塞,直到槽函数运行完。本来就阻塞了。更别谈槽函数运行了。死锁了

3.connect实现

connect实现代码非常多,感兴趣的可以到这里阅读:QT5 qobject.cpp
总结下来分为这几步:
1.QObject类对象内部维护了一个名为connectionLists的成员变量,用于记录信号和槽函数的关联
2.MOC 会在预处理阶段根据 Q_OBJECT 宏生成对应的元对象信息,并将这些信息存储在 QObject 类中的一个指针变量中,可以通过 QObject::metaObject() 方法获取
3.在发射信号时,信号方会生成一个携带信号索引和参数的结构体,然后调用 QMetaObject::activate() 方法。QMetaObject::activate() 方法会先根据槽函数所在的类的元对象信息,获取该类存储的槽函数索引,然后根据索引找到相应的槽函数并调用

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式(二)单例模式的七种写法

相关文章设计模式系列 面试的时候,问到许多年轻的Android开发他所会的设计模式是什么,基本上都会提到单例模式,但是对单例模式也是一知半解,在Android开发中我们经常会运用单例模式,所以我们还是要更了解单例模式才对…

汇编语言与接口技术实践——秒表

1. 设计要求 基于 51 开发板,利用键盘作为按键输入,将数码管作为显示输出,实现电子秒表。 功能要求: (1)计时精度达到百分之一秒; (2)能按键记录下5次时间并通过按键回看 (3)设置时间,实现倒计时,时间到,数码管闪烁 10 次,并激发蜂鸣器,可通过按键解除。 2. 设计思…

音视频技术-电脑连接调音台时交流声的产生与消除

当电脑(笔记本/台式机)声卡通过音频线与调音台(或扩音机)连接时,能听到“交流声”。有时很轻微,有时很明显,甚至干扰正常的演讲或发言。 很多时候,我们在台上演讲时,都会…

模拟、排序(归并排序)算法

模拟、排序算法 一、模拟例题1、错误票据题目信息思路题解 2、回文日期题目信息思路方法一:暴力做法方法二:优化解法 题解方法一:暴力求解方法二:优化解法 二、排序例题1、归并排序题目信息思路题解 一、模拟 例题 1、错误票据 …

springboot222学生网上选课系统的设计与实现

学生网上选课系统的设计与实现 摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统学生选课信息管理难度大&…

MDC500-16-ASEMI工业电机专用MDC500-16

编辑:ll MDC500-16-ASEMI工业电机专用MDC500-16 型号:MDC500-16 品牌:ASEMI 正向电流(Id):500A 反向耐压(VRRM):1600V 正向浪涌电流:600A 正向电压&a…

MATLAB Function转C代码实战

文章目录 前言1. 准备工作2. 使用MATLAB Coder2.1 确定输入输出的类型2.2 MATLAB Coder过程 3. 代码调整和优化4. 编译和测试5. 性能分析和优化结语 前言 在科学与工程领域,MATLAB(Matrix Laboratory)是一种广泛使用的高级技术计算软件&…

【C之·预处理器】

系列文章目录 文章目录 前言一、预处理指令1. #line的用法1.1 概述 2. #error2.1 概述 二、示例1. #line2. #error 总结 前言 C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C 预处理器只不过是一个文本替换工具而已&#x…

从0到1入门C++编程——08 函数模板和类模板

文章目录 函数模板1.函数模板基本语法2.函数模板使用的注意事项3.函数模板案例——数组排序4.普通函数和函数模板的区别5.普通函数和函数模板的调用规则6.模板的局限性 类模板1.类模板2.类模板和函数模板的区别3.类模板中成员函数创建时机4.类模板对象做函数参数5.类模板与继承…

飞机订票系统

飞机订票系统 获取源码——》公主号:计算机专业毕设大全

Sora背后团队大揭秘!天才00后?

现在世界上最受关注的技术团队是哪一支? Sora 团队,已经来到聚光灯中心。 不仅项目负责人评论区被挤爆,成了𝕏最火“景点” 。 当 OpenAI 出手发布 Sora 之后,给人一种降维打击的感觉 —— 效果和之前的技术相比高出…

「哈哥赠书活动 - 48期」-『商业分析思维与实践:用数据分析解决商业问题宣传文案』

⭐️ 赠书 - 《商业分析思维与实践》 ⭐️ 内容简介 本书以业务为导向,详细地讲解了如何通过大数据分析来解决商业问题。其目的在于运用大数据分析思维,帮助读者把学术知识应用于真实的业务场景,解决实际的业务问题。本书基于业务问题&#x…