Signals & Slots

来源:互联网 发布:淘宝卖什么好呢 编辑:程序博客网 时间:2024/06/10 09:46

信号

当某个信号对其客户或所有者发生的内部状态发生改动,信号被一个对象发射。只有定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,和其相关联的槽将被即时执行,就象一个正常的函数调用相同。信号-槽机制完全独立于所有GUI事件循环。只有当所有的槽返回以后发射函数(emit)才返回。如果存在多个槽和某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地执行,不过他们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪个后执行。
信号的声明是在头文件中进行的,QT的signals关键字指出进入了信号声明区,随后即可声明自己的信号。
从形式上讲信号的声明和普通的C++函数是相同的,不过信号却没有函数体定义,另外,信号的返回类型都是void。信号由moc自动生成,不需要在 .cpp 中implemented

当一个信号被发出时连接他的槽被调用。槽是一个普通的C++函数并按普通方式调用;他的特点仅仅是可以被信号连接。
由于槽只是普通的成员函数,当调用时直接遵循C++规则。然而,对于槽,他们可以被任何组件通过一个信号-槽连接(signal-slot connection)调用,而不管其访问权限。也就是说,一个从任意的类的实例发出的信号可导致一个不与此类相关的另一个类的实例的私有槽被调用。

元对象工具

元对象编译器moc(meta object compiler)对C++文件中的类声明进行分析并产生用于初始化元对象的C++代码,元对象包含全部信号和槽的名字及指向这些函数的指针。
moc 读C++源文件,如果发现有Q_OBJECT宏声明的类,他就会生成另外一个C++源文件,这个新生成的文件中包含有该类的元对象代码。例如,假设我们有一个头文件mysignal.h,在这个文件中包含有信号或槽的声明,那么在编译之前 moc 工具就会根据该文件自动生成一个名为mysignal.moc.h的C++源文件并将其提交给编译器;类似地,对应于mysignal.cpp文件moc 工具将自动生成一个名为mysignal.moc.cpp文件提交给编译器。
元对象代码是signal/slot机制所必须的。用moc产生的C++源文件必须和类实现一起进行编译和连接,或用#include语句将其包含到类的源文件中。moc并不扩展#include或#define宏定义,他只是简单的跳过所遇见的所有预处理指令。
Q_OBJECT宏由预处理器展开,用来声明由moc实现的几个成员函数;如果你的编译器出现错误如下”undefined reference to vtable for xxxx”, 你可能忘了运行moc或者没有用连接命令包含moc输出。

参考博客:

0 0
原创粉丝点击