为什么Q_OBJECT会破坏QDoc?



>问题

自从从Qt 5.10升级到Qt 5.11以来,我开始遇到为现有项目生成QDoc文档的问题。

许多问题之一是文档中缺少函数,尽管源代码中存在相应的注释。

研究

我已经设法将问题缩小到包含Q_OBJECT宏,如提供的代码示例所示(见下文(。

Qt文档中确实提到了这一点:

如果未由Cpp.ignoretokensCpp.ignoredirectives变量指定,则非标准构造(通常是宏(可能会导致错误的文档。

不过,Q_OBJECT不应该引起问题,因为再往前一点,它就写了:

但是,Q_OBJECT宏是一个例外:QDoc 识别此特定的非标准构造,因此无需使用Cpp.ignoredirectives变量指定它。

无论如何,我确实在我的qdocconf文件中包含了qt-cpp-defines.qdocconf

我还尝试手动将Q_OBJECT添加到忽略列表中

Cpp.ignoredirectives += Q_OBJECT

但结果是一样的。

我在 Windows 10 和 Ubuntu 17 下遇到了上述问题。在Windows 7下,我根本无法执行qdoc.exe

解决此问题的正确qdocconf配置是什么?

最小示例

为了快速复制(在实际情况中,声明和实现被拆分并添加适当的注释(,请考虑以下设置:

福.h

#include <QObject>
class Foo : public QObject
{
//  Q_OBJECT // <-- uncomment this to break QDoc
public:
Foo() {}
void boo() {}
protected:
void moo() {}
};

福.cpp

#include "Foo.h"
/*!
class Foo
*/

test.qdocconf

include($QT_INSTALL_DOCS/global/compat.qdocconf)
include($QT_INSTALL_DOCS/global/fileextensions.qdocconf)
include($QT_INSTALL_DOCS/global/qt-cpp-defines.qdocconf)
include($QT_INSTALL_DOCS/global/macros.qdocconf)
# Uncoment this for a test
# Cpp.ignoredirectives += Q_OBJECT
outputdir   = html
headerdirs  = .
sourcedirs  = .
exampledirs = .
imagedirs   = ./images

结果

  • 良好的结果(无Q_OBJECT(

执行qdoc.exe test.qdocconf我或多或少得到以下结果:

内容

  • 公共职能
  • 受保护的功能
  • 详细说明

福类

  • 所有成员的列表,包括继承的成员

公共职能

福((

无效嘘((

受保护的功能

虚哞((

详细说明

成员函数文档

Foo::Foo((

默认构造 Foo 的实例。

void Foo::boo((

[受保护] void Foo::moo((

  • 结果不好(带Q_OBJECT(

取消注释Q_OBJECT宏并再次运行qdoc.exe会得到以下结果:

内容

  • 详细说明

福类

详细说明

重要提示:Foomooboo都消失了。

我知道这个问题已经有几年了,但我想为将来找到这个问题的搜索者发布一个答案。我的.cpp文件中的Q_OBJECT和Q_INVOKABLE宏都遇到了这个问题。

解决方案是在 .qdocconf 文件中使用未记录的命令,includepaths,或者在运行qdoc时将-I参数传递给命令。

我只会展示我是如何让它与我的 config.qdocconf 文件一起工作

...
# undocumented feature that simulates passing -I parameters to the command line
includepaths = . 
.. 
$QT_INSTALL_HEADERS 
$QT_INSTALL_HEADERS/QtCore 
$QT_INSTALL_HEADERS/QtGui 
$QT_INSTALL_HEADERS/QtQuick 
$QT_INSTALL_DOCS
...

如果需要,还可以使用绝对路径而不是$QT_INSTALL_HEADERS

查看这些特殊变量指向何处的一种简单方法是运行qmake -query(如果需要qmake命令,请使用qt安装bin的绝对路径(

编辑:对我来说,$QT_INSTALL_HEADERS=C:/Qt/5.12.9/msvc2017_64/include

编辑 2:确保在运行 qdoc 之前,请确保您已在系统上安装了 clang(通过巧克力、自制软件、apt 或其他方式(,如果在运行 qdoc 之前运行set LLVM_INSTALL_DIR=C:Program FilesLLVM的 Windows 上 - 此处的说明:为 QDoc 安装 Clang

我想出的唯一解决方案是将以下预处理器指令添加到Q_OBJECT宏中:

#ifndef Q_QDOC
Q_OBJECT
#endif //Q_QDOC

Q_QDOC是在包含的qt-cpp-defines.qdocconf中定义的,因此QDoc跳过宏,但它不在构建系统中定义,代码像往常一样编译。

相关内容

  • 没有找到相关文章

最新更新