为啥在 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”文件很重要?的主要内容,如果未能解决你的问题,请参考以下文章

Qt源码学习之信号槽

将 Qt moc 文件添加到项目中

qt中moc的作用

cmake 不使用 QT4_automoc 生成 Qt moc 文件

涉及 moc 文件的 Qt 错误未通过清理项目修复

the Meta-Object Compiler (moc)