“#include <QtCore/QCoreApplication>”与“#include <QCoreApplication>”

Posted

技术标签:

【中文标题】“#include <QtCore/QCoreApplication>”与“#include <QCoreApplication>”【英文标题】:"#include <QtCore/QCoreApplication>" vs "#include <QCoreApplication>" 【发布时间】:2012-08-11 07:47:51 【问题描述】:

当我在 Qt Creator 中创建一个新的移动应用程序时,我注意到在自动生成的代码中他们使用 #include &lt;QtCore/QCoreApplication&gt; 而不是 #include &lt;QCoreApplication&gt;,尽管两者应该是一样的。

由于 Qt Creator 本身就是这样做的,我认为这是推荐的约定。但是有什么理由会这样吗,有人能解释一下使用#include &lt;QtCore/QCoreApplication&gt;而不是#include &lt;QCoreApplication&gt;有什么意义吗?

【问题讨论】:

这真的与Qt无关,这只是一个关于你应该在多大程度上限定代码文件中包含路径的问题。我真的不认为有“推荐的约定”。你只要在你的环境中做任何有意义的事情。 【参考方案1】:

使用这种约定有多种原因:-

    如果编译器中包含的路径位于 QtCore 的目录级别,那么它将从那里跟踪包含文件 QCoreApplication。 由于同一目录下存在多个 Qt 版本,因此最好使用丢弃歧义的约定。(由于两个 QCoreApplication 一个属于 Qt3 另一个 Qt4 会误导编译器)

我在 /usr/include/ 中有两个目录

QtCore Qt

它们都有QCoreApplication。

【讨论】:

【参考方案2】:

对于从表单生成的代码,您可以在“Designer”选项卡选项中进行更改:“Use Qt module name in #include-directive”。

在指定模块时,我注意到一个小问题,但有时很烦人。默认情况下 qmake 添加 /path/to/qt/sdk/include 以包含路径。这意味着您可以例如做

#include <QtGui/QWidget>

即使在你的项目文件中有

QT -= gui

然后编译顺利,但链接器会生你的气,因为不会选择 QtGui4 库进行链接。

如果你这样做了

#include <QWidget>

编译反而会失败。

【讨论】:

另一个我不指定模块的原因是 Qt5 迁移和 QtGui vs QtWidget,如果你不指定模块,你可以让你的项目在两者上编译。

以上是关于“#include <QtCore/QCoreApplication>”与“#include <QCoreApplication>”的主要内容,如果未能解决你的问题,请参考以下文章