c++ - 为什么在 Qt 源代码文件末尾包含 ".moc"文件很重要?

标签 c++ qt introspection moc

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

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

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

最佳答案

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

  1. qmake 必须在您的 Makefile 中生成规则以调用 .cpp 上的 moc > 文件。

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

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

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

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

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

从 2. 您还可以推测在 .h 中使用 Q_OBJECT 定义类不需要任何特殊包含。

关于c++ - 为什么在 Qt 源代码文件末尾包含 ".moc"文件很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34928933/

相关文章:

c++ - 了解 OPT 算法

c++ - 如何在 qt4 设计器中创建自定义插槽?

c++ - 发送命令后串口关闭

qt - 你如何使用 qt 创建独立的(只有一个 exe)应用程序?

ruby - define_method 带有预定义的关键字参数

C++ 对象或二维数组作为参数?

c++ - 我如何将一个 int 添加到一个字符串

python - Qtablewidget去除黑色空间PyQt5

d - 如何列出(编译时自省(introspection))D 中的所有类/结构方法?

python - 在 python 中,有没有办法在将对象传递给函数之前知道它是否为 "implements an interface"?