Inside Qt Series (十一):emit,幕后的故事
来源:互联网 发布:linux无法进入图形界面 编辑:程序博客网 时间:2024/05/03 12:08
当我们写下一下emit signal代码的时候,与这个signal相连接的slot就会被调用,那么这个调用是如何发生的呢?让我们来逐一解开其中的谜团。
让我们来看一段例子代码:
- class ZMytestObj : public QObject
- {
- Q_OBJECT
- signals:
- void sigMenuClicked();
- void sigBtnClicked();
- };
复制代码
MOC编译器在做完预处理之后的代码如下:
- // SIGNAL 0
- void ZMytestObj::sigMenuClicked()
- {
- QMetaObject::activate(this, &staticMetaObject, 0, 0);
- }
- // SIGNAL 1
- void ZMytestObj::sigBtnClicked()
- {
- QMetaObject::activate(this, &staticMetaObject, 1, 0);
- }
复制代码
哈哈,看到了把,每一个signal都会被转换为一个与之相对应的成员函数。也就是说,当我们写下这样一行代码:
emit sigBtnClicked();
当程序运行到这里的时候,实际上就是调用了void ZMytestObj::sigBtnClicked() 这个函数。
大家注意比较这两个函数的函数体,
void ZMytestObj::sigMenuClicked() void ZMytestObj::sigBtnClicked(),
它们唯一的区别就是调用 QMetaObject::activate 函数时给出的参数不同,一个是0,一个是1,它们的含义是什么呢?它们表示是这个类中的第几个signal被发送出来了,回头再去看头文件就会发现它们就是在这个类定义中,signal定义出现的顺序,这个参数可是非常重要的,它直接决定了进入这个函数体之后所发生的事情。
当执行流程进入到QMetaObject::activate函数中后,会先从connectionLists这个变量中取出与这个signal相对应的 connection list,它根据的就是刚才所传入进来的signal index。这个connection list中保存了所有和这个signal相链接的slot的信息,每一对connection(即:signal 和 slot 的连接)是这个list中的一项。
在每个一具体的链接记录中,还保存了这个链接的类型,是自动链接类型,还是队列链接类型,或者是阻塞链接类型,不同的类型处理方法还不一样的。这里,我们就只说一下直接调用的类型。
对于直接链接的类型,先找到接收这个signal的对象的指针,然后是处理这个signal的slot的index,已经是否有需要处理的参数,然后就使用这些信息去调用receiver的qt_metcall 方法。
在qt_metcall方法中就简单了,根据slot的index,一个大switch语句,调用相应的slot函数就OK了。
- Inside Qt Series (十一):emit,幕后的故事
- Inside Qt Series (十一):emit,幕后的故事
- Inside Qt Series (十一):emit,幕后的故事
- Inside Qt Series (十一):emit,幕后的故事
- Inside Qt Series (十一):emit,幕后的故事
- Inside QT Series (十):connect,幕后的故事
- Inside Qt Series (十):connect,幕后的故事
- Inside Qt Series (十):connect,幕后的故事
- Inside Qt Series (十):connect,幕后的故事
- Inside Qt Series (十):connect,幕后的故事
- Inside Qt Series (十):connect,幕后的故事
- emit,幕后的故事
- Inside Qt Series: Preface
- Inside Qt Series
- Inside Qt Series
- Inside QT Series 序
- Inside Qt Series (十二):Qt对象之间的父子关系
- Inside Qt Series (十二):Qt对象之间的父子关系
- 2004 马云十年回忆
- 千万别当科学家,博士留给中国和印度学生——他们家乡的情况更糟糕
- 实现大数幂的计算
- 世界侦探小说之巅—福尔摩斯
- 怎样保存网页中的视频文件
- Inside Qt Series (十一):emit,幕后的故事
- 关于jsp乱码问题的解决办法
- 网页打开特慢是怎么回事?
- shell 脚本学习指南-笔记(二)
- 放弃的东西不要再试图拿回来
- LVS源码分析三---netfilter hook
- 一天征服傅立叶变换
- [技术学习]使用 wine 在Unix平台进行 WIN32/MFC 开发
- 【转】觉得还挺准的描述了我这个天蝎的性格