为什么在 Qt 源代码文件末尾包含“.moc”文件很重要?

Why is important to include ".moc" file at end of a Qt Source code file?

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

这是几个 Qt 示例中使用的常见步骤,包括这个: http://doc.qt.io/qt-5/qttestlib-tutorial1-example.html; 其中 #include "testqstring.moc" 行应包含在文件末尾。

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

如果在.cpp文件中用Q_OBJECT宏定义QObject子class是必须的。当你这样做:

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

    那个特殊的(骇人听闻的?)包含触发 qmake 这样做,并告诉它当在您的 .cpp

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

    通常在头文件中定义 classes,其中包含 Q_OBJECTmoc 然后在其生成的输出中添加一个 #include "header.h",这意味着 moc 的输出可以愉快地编译。

    但是如果您的 class 定义在 .cpp 中怎么办?您不能在 moc 的输出中 #include 一个 .cpp 文件,因为那样会给您大量的重定义错误。

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

从 2. 你也可以假设在 .h 中用 Q_OBJECT 定义 classes 不需要任何特殊包含。

补充一下:

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

Q_OBJECT在xxx.cpp,qmake之后,系统会生成一个xxx.moc,需要在.cpp文件中加入.moc文件.