>问题
自从从Qt 5.10升级到Qt 5.11以来,我开始遇到为现有项目生成QDoc文档的问题。
许多问题之一是文档中缺少函数,尽管源代码中存在相应的注释。
研究
我已经设法将问题缩小到包含Q_OBJECT
宏,如提供的代码示例所示(见下文(。
Qt文档中确实提到了这一点:
如果未由
Cpp.ignoretokens
或Cpp.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
会得到以下结果:
- 傅
内容
- 详细说明
福类
详细说明
重要提示:Foo
,moo
和boo
都消失了。
我知道这个问题已经有几年了,但我想为将来找到这个问题的搜索者发布一个答案。我的.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
跳过宏,但它不在构建系统中定义,代码像往常一样编译。