为什么在Qt cpp源代码中添加.moc文件的包含很重要?
这是几个Qt样本中常用的步骤,包括以下步骤: http://doc.qt.io/qt-5/qttestlib-tutorial1-example.html; #include" testqstring.moc"应该包含在文件的末尾。
我不明白为什么这是必要的。
感谢。
答案 0 :(得分:21)
如果您使用QObject
文件中的Q_OBJECT
宏定义.cpp
子类,则必须这样做。当您这样做时:
qmake
必须在Makefile
内生成规则,才能在该moc
文件上调用.cpp
。
那个特殊的(hackish?)包含会触发qmake
这样做,并在你的{moc
上调用时会告诉它teststring.moc
的输出文件(.cpp
) {1}}。
为了编译moc
的输出(仍然是一堆C ++代码),编译器必须看到你的类定义。否则,它将抱怨没有YourClass::staticMetaObject
之类的东西,因为它不知道YourClass
存在。
通常,在头文件中定义以Q_OBJECT
为特征的类。 moc
然后在其生成的输出中添加#include "header.h"
,这意味着可以愉快地编译moc
的输出。
但是,如果您的班级定义位于.cpp
内,该怎么办?您无法在#include
的输出中.cpp
moc
个文件,因为这会给您带来大量的重新定义错误。
相反,您#include
中的moc
.cpp
输出,以便它汇总在一起,每个人都很高兴。 (这意味着qmake
只会发出一条规则来表示运行moc
,而不会发出另一条规则告诉编译器编译moc
的输出。)
从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文件中。