我什么时候必须在 Qt 中包含 moc*.cpp?

When do I have to include moc*.cpp in Qt?

我明白为什么最好手动包含 moc*.cpp 而不是让 moc 自己做的基本概念,但我不太明白 when我必须包括它。

假设我有 mainwindow.cppmainwindow.hpp,它们需要 moc 运行。在这里,我知道我必须在 mainwindow.cpp 中包含 moc_mainwindow.cpp(而不是在 mainwindow.hpp 中)。

但是如果我有包含 mainwindow.hppfoo.cpp,我是否必须在 foo.cpp 中包含 moc_mainwindow.hpp?我只是不清楚整个 moc 是如何工作的,所以有人可以解释一下吗? (而且,是的,我确实在互联网上对此进行了研究 - 我阅读了关于 moc 的 Qt 文档,但它并没有让我清楚)。

moc 文件包含元对象的实现、信号槽糖和其他一些东西。这意味着如果你多次编译它,你将在链接阶段有重复的符号。

实际上你最好的选择是不包含 moc'ed 文件并将其添加为项目的其他正常编译单元。它简化了您的代码,防止了链接错误,并且在修改实现文件时对您的编译时间有很好的影响。

然而,如果您决定手动包含 moc 文件,则必须只在一个地方执行,以防止上述重复实现。

另一种直接包含对表现力有用的情况是当您在 .cpp 文件中用 Q_OBJECT 声明 class 时:在同一文件中包含 moc'ed 与这样的 class 只属于那个文件的事实。