Qt 将源代码交给标准 C++ 编译器,如 gcc 之前,需要事先将这些扩展的语法去除掉。完成这一操作的就是 moc。
moc 全称是 Meta-Object Compiler,也就是“元对象编译器”。Qt 程序在交由标准编译器编译之前,先要使用 moc 分析 C++ 源文件。如果它发现在一个头文件中包含了宏 Q_OBJECT,则会生成另外一个 C++ 源文件。这个源文件中包含了 Q_OBJECT 宏的实现代码。这个新的文件名字将会是原文件名前面加上 moc_ 构成。这个新的文件同样将进入编译系统,最终被链接到二进制代码中去。因此我们可以知道,这个新的文件不是“替换”掉旧的文件,而是与原文件一起参与编译。另外,我们还可以看出一点,moc 的执行是在预处理器之前。因为预处理器执行之后,Q_OBJECT 宏就不存在了。
STEP2 编译[UI实现文件],输出[MOC代码文件]。 [UI实现文件]一方面继承自QT的UI相关类,例如QWidget、QMainWindow,另一方面包含了[UI头文件],而这个头文件由于自定义了生成步骤,则会同时输出[MOC代码文件]。这个[MOC代码文件]和[UI实现文件],分别实现了UI类的2部分:QT的MOC机制和基本的C++类实现。这很巧妙,分2部分来定义一个标准的C++类,其中一部分是编译了另外一部分后生成的。 这个[MOC代码文件]很简单,就是Q_OBJECT宏定义的实现代码部分。这部分在官方帮助文档“Meta-Object System”中有详细说明。而MOC文件的工作方式在官方帮助文档“Using the Meta-Object Compiler (moc)”中有详细说明。
STEP3 编译[MOC代
Qt 将源代码交给标准 C++ 编译器,如 gcc 之前,需要事先将这些扩展的语法去除掉。完成这一操作的就是 moc。
moc 全称是 Meta-Object Compiler,也就是“元对象编译器”。Qt 程序在交由标准编译器编译之前,先要使用 moc 分析 C++ 源文件。如果它发现在一个头文件中包含了宏 Q_OBJECT,则会生成另外一个 C++ 源文件。这个源文件中包含了 Q_OBJECT 宏的实现代码。这个新的文件名字将会是原文件名前面加上 moc_ 构成。这个新的文件同样将进入编译系统,最终被链接到二进制代码中去。因此我们可以知道,这个新的文件不是“替换”掉旧的文件,而是与原文件一起参与编译。另外,我们还可以看出一点,moc 的执行是在预处理器之前。因为预处理器执行之后,Q_OBJECT 宏就不存在了。