如前所述,Qt使用自己的预编译器,它提供了对C++的扩展。使用Qt的信号插槽机制,独立的模块可以相互连接,而不需要意识到模块的任何细节。
为了实现这个目标,Qt提出了一个元对象系统。它提供了两个关键功能:信号槽和自检。

在面向对象编程中会提到Smalltalk语言有一个元类系统。元类就是我们所说的元类。如果你曾经写过HTML,你会知道在HTML标签里有一个,用来解释页面的一些属性。同样,Qt的元对象系统也扮演着类似的角色。自省,也称为反射,允许程序在运行时获得关于类的信息,即元信息。什么是元信息?比如这个班叫什么?它的属性是什么?有什么办法吗?它的信号列表?它的槽表等等就是这个类的元信息,也就是“元信息”。这个机器系统也为国际化提供支持,是QSA的基础。

C++没有Qt的元信息所要求的动态元信息。所以Qt提供了一个独立的工具moc,通过定义Q_OBJECT宏来实现从标准C++函数的转换。Moc是纯C++实现的,所以可以用在任何编译器上。
这种机制的工作过程是:
首先,Q_OBJECT宏声明了一些q _ object的子类必须实现的内省函数,如metaObject、tr、qt_metacall等。
其次,Qt的moc工具实现了Q_OBJECT宏声明的函数和所有信号;
第三,QObject成员函数connect和disconnect使用这些自省函数来连接信号插槽。
这些过程都是由qmake、moc和QObject自动处理的,不需要你去想。如果你对实现很好奇,可以看看QmetaObject的文档和moc的源代码。


