为啥在 Qt 源代码文件末尾包含“.moc”文件很重要?
Posted
技术标签:
【中文标题】为啥在 Qt 源代码文件末尾包含“.moc”文件很重要?【英文标题】:Why is important to include ".moc" file at end of a Qt Source code file?为什么在 Qt 源代码文件末尾包含“.moc”文件很重要? 【发布时间】:2016-01-21 16:21:16 【问题描述】:为什么在 Qt cpp 源代码中为 .moc 文件添加包含很重要?
这是几个 Qt 示例中使用的常用步骤,包括以下示例:
http://doc.qt.io/qt-5/qttestlib-tutorial1-example.html; 其中#include "testqstring.moc"
行应包含在文件末尾。
我不明白为什么这是必要的。
【问题讨论】:
如果您在单独的头文件中声明Q_OBJECT
类,则无需这样做。否则它会丢失所有使QObject
成为QObject
的附加功能。
【参考方案1】:
如果在.cpp
文件中使用Q_OBJECT
宏定义QObject
子类,则必须这样做。 这样做时:
qmake
必须在您的 Makefile
中生成规则才能在该 .cpp
文件上调用 moc
。
那个特殊的(hackish?)包含会触发qmake
这样做,并告诉它在.cpp
上调用时哪个是moc
的输出文件(teststring.moc
)。
为了编译moc
的输出(仍然是一堆C++代码),编译器必须看到你的类定义。否则,它会抱怨没有@这样的东西987654334@ 和类似的,因为它不知道YourClass
存在。
通常在头文件中定义具有Q_OBJECT
的类。 moc
然后将#include "header.h"
添加到其生成的输出中,这意味着moc
的输出可以愉快地编译。
但是如果你的类定义在 .cpp
中呢?您不能在moc
的输出中使用#include
.cpp
文件,因为这会给您带来大量的重新定义错误。
相反,您将#include
moc
的输出放在您的.cpp
中,这样它就可以编译在一起,每个人都很高兴。 (这意味着qmake
只会发出一条规则说运行moc
,但不会发出另一条规则告诉编译器编译moc
的输出。)
从 2. 开始,您还可以假设在 .h
中定义具有 Q_OBJECT
的类不需要任何特殊包含。
【讨论】:
为什么qt文档在doc.qt.io/qt-5/qttestlib-tutorial1-example.html;是否在 cpp 中包含 moc 文件?? 正如我所说,在 cpp 中有一个带有Q_OBJECT
的类定义。【参考方案2】:
添加:
当Q_OBJECT
在xxx.h之后,在qmake
之后,系统会生成一个moc_xxx.cpp
,里面有xxx.h。
当Q_OBJECT
在xxx.cpp中,qmake
之后,系统会生成一个xxx.moc
,需要在.cpp文件中添加.moc文件。
【讨论】:
以上是关于为啥在 Qt 源代码文件末尾包含“.moc”文件很重要?的主要内容,如果未能解决你的问题,请参考以下文章