为什么重要的是包括" .moc"文件在Qt源代码文件的末尾?

时间:2016-01-21 16:21:16

标签: c++ qt introspection moc

为什么在Qt cpp源代码中添加.moc文件的包含很重要?

这是几个Qt样本中常用的步骤,包括以下步骤: http://doc.qt.io/qt-5/qttestlib-tutorial1-example.html; #include" testqstring.moc"应该包含在文件的末尾。

我不明白为什么这是必要的。

感谢。

2 个答案:

答案 0 :(得分:21)

如果您使用QObject文件中的Q_OBJECT宏定义.cpp子类,则必须这样做。当您这样做时:

  1. qmake必须在Makefile内生成规则,才能在该moc文件上调用.cpp

    那个特殊的(hackish?)包含会触发qmake这样做,并在你的{moc上调用时会告诉它teststring.moc的输出文件(.cpp) {1}}。

  2. 为了编译moc的输出(仍然是一堆C ++代码),编译器必须看到你的类定义。否则,它将抱怨没有YourClass::staticMetaObject之类的东西,因为它不知道YourClass存在。

    通常,在头文件中定义以Q_OBJECT为特征的类。 moc然后在其生成的输出中添加#include "header.h",这意味着可以愉快地编译moc的输出。

    但是,如果您的班级定义位于.cpp内,该怎么办?您无法在#include的输出中.cpp moc个文件,因为这会给您带来大量的重新定义错误。

    相反,您#include中的moc .cpp输出,以便它汇总在一起,每个人都很高兴。 (这意味着qmake只会发出一条规则来表示运行moc,而不会发出另一条规则告诉编译器编译moc的输出。)

  3. 从2.您还可以假设在Q_OBJECT中定义具有.h的类不需要任何特殊包含。

答案 1 :(得分:1)

补充:

Q_OBJECT在xxx.h中,qmake之后,系统会生成一个moc_xxx.cpp,里面有xxx.h。

当xxx.cpp中的Q_OBJECT时,在qmake之后,系统会生成一个xxx.moc,需要将.moc文件添加到.cpp文件中。