Qt信号槽机制的实现(面试的感悟,猜测每一个类保存的一个信号和槽的二维表,实际使用函数指针 元对象 还有类型安全的检查设定等等)
因为面试时问了我这道题,导致我想去了解信号槽到底是如何实现的,于是贴着顺序看了下源码,大致了解了整个框架。网上关于信号槽的文章也很多,但是大部分都是将如何应用的,这里我就写一下我所理解的如何实现吧, 由于时间仓促,源码阅读的也不甚仔细,难免导致最终理解有偏差或错误,大家看出了请一定指正。
首先:信号槽其实就是三部分组成:信号的声明,槽的声明和实现 以及 connect函数。这其中我觉得最重要的就是这个connect函数了。
1:对于Qt中的每个含有Q_OBJECT的类对象,其内部都有一个类对象数据成员等。我觉得他们是用来保存一个二维表的。亦即:是保存的一个信号和槽的二维表。对于某一个信号:在二维表中存放着这个信号对应的槽的函数指针!(面试官也问过我:想没想过用函数指针来代替信号槽)。所以:要想实现信号槽,只需要把每个对象的这个表填满就OK。而填满的过程就是依据connect函数来做的。
2:对于一个connect函数,其含有发出信号的对象 和 接受者对象的指针,所以它可以同时操作这两者。当执行到它时:它会依据接收者的指针去获得:槽的函数指针,而后用这个函数指针值去填充发出信号的对象的二维表。
3:当用connect填充好二维表之后:我们每次emit signal_1()时:其实就是依据这个信号的名字去查询二维表,找到对应的槽的函数指针并进行调用而已。
当然了,在具体实现上肯定没这么简单,
1:依据信号名来查找槽的函数指针:其实是先依据信号名找到其在对象内部的一个代表参数,而后用这个参数去查找。
2:每个对象在创建时都会创建一个QMetaObejct元对象数据成员,这个主要功能之一就是用来做信号槽的二维表的。
3:正如荆鹏大牛所言:这其中还有类型安全的检查设定等等~~
所以:信号槽这个东西也没多么神秘,我们完全可以自己架设这样一个构架。
http://blog.csdn.net/nrc_douningbo/article/details/5701935
Qt信号槽机制的实现(面试的感悟,猜测每一个类保存的一个信号和槽的二维表,实际使用函数指针 元对象 还有类型安全的检查设定等等)的更多相关文章
- QT信号槽机制
信号槽 信号槽是QT中用于对象间通信的一种机制,也是QT的核心机制.在GUI编程中,我们经常需要在改变一个组件的同时,通知另一个组件做出响应.例如: 一开始我们的Find按钮是未激活的,用户输入要查找 ...
- Qt源码分析之信号和槽机制
Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的说法,简单点说就是如何在一个类的一个 ...
- Qt源码分析之信号和槽机制(QMetaObject是一个内部struct)
Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的说法,简单点说就是如何在一个类的一个 ...
- 深入Qt 学习 -- 反射机制(比较简单清楚)
相对于Java天生的这一特性, C++并不具备;但进入到Qt领域,这一切都变得简单自如了. 从Qt的元对象系统可知,除了提供信号/槽机制的特性之外,它还提供了以下特性: ■ QObject::meta ...
- QT Embedded二三事之QObject的元对象
一.元对象 元对象被称做是meta object.在运行时刻(runtime),能够提供对象的运行时信息. 在C++语言发展的早期,C++语言本身没有定义对象的运行时信息,如输出类的名 ...
- qt二维码示例
原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://blog.csdn.net/hiwubihe/article/details/38679621,qq:1269122125. 移动终 ...
- Delphi 函数指针(三大好处:灵活,委托的本质,回调机制),还可把函数指针当参数传入
首先学习: 指向非对象(一般的)函数/过程的函数指针 Pascal 中的过程类型与C语言中的函数指针相似,为了统一说法,以下称函数指针.函数指针的声明只需要参数列表:如果是函数,再加个返回值.例如声明 ...
- c++面试题中经常被面试官面试的小问题总结(二)(本篇偏向指针知识)
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/10713204.html 1.利用指针交换两个字符串方法?(这题是我当年读大一的时候看到的,好怀 ...
- qt中信号与槽机制
一. 简介 就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁. 信号和槽机制是 Qt 的核心机制,可以让编程人员将互不 ...
随机推荐
- yum node.js
很久之前安装过windows下以及Mac下的node,感觉还是很方便的,不成想今天安装linux下的坑了老半天,特此记录. 首先去官网下载代码,这里一定要注意安装分两种,一种是Source Code源 ...
- "Classifying plankton with deep neural networks" notes
cross entropy loss is not quite the same as optimizing classification accuracy. Althougth the two ar ...
- 关于lvs+keepalived只加入一台realserver问题
今天做lvs+keepalived+mysql项目实施方案,在配置lvs+keepalived时都是ok的,但是就只加入第一台realserver.本人也感到很奇怪,lvs+keepalived本人也 ...
- Prisma
AI修图艺术:Prisma背后的奇妙算法 | 深度 投递人 itwriter 发布于 2016-07-30 12:47 评论(2) 有712人阅读 原文链接 [收藏] « » 雷锋网按:本文作者系图普 ...
- oc @property参数
- HttpContext.Cache和Application的区别
原文:HttpContext.Cache和Application的区别 (转载) 应用程序级的Cache和Application用户会话级的Session application的缺点是在读取时最 ...
- C语言入门(20)——使用VC2013对C语言进行调试
软件调试过程中,有时会一些逻辑和内存访问方面的问题,如果没有调试器的帮助,找出何处代码导致这块内存被更改是一件非常麻烦的事情.恰当运用数据断点可以快速帮我们定位问题的所在. 1.VC的调试快捷键 F5 ...
- editplus使用:非法字符: \65279
众所周知,在跨程序的工程中,统一编码是至关重要的,而目前最普遍的则是统一采用“utf8”编码方案. 但是在采用utf8方案的时候,请注意编辑器的自作聪明. 比如editplus. 原因就在于某些编辑器 ...
- linux svn服务器普通passwd和sasl2配置
朋友昨天问我一个问题,他公司使用的vpn连接的svn,使用svn管理软件进行svn update是可行的,使用命令行svn update出错,svn status可行. 思路1: 刚开始我关注的焦点都 ...
- float
.clearfix:after { visibility: hidden; display: block; font-size: 0; content: " "; clear: b ...