После обновления с Qt 5.10 до Qt 5.11 у меня начались проблемы при создании документации с QDOC для моих существующих проектов.
Одной из многих проблем является отсутствие функций в документации, хотя соответствующие комментарии существуют в исходном коде.
Мне удалось сузить вопрос до включения Q_OBJECT
макрос, как показано в приведенном примере кода (см. ниже).
Это действительно упоминается в Документация Qt:
Если не указано
Cpp.ignoretokens
или жеCpp.ignoredirectives
переменные, нестандартные конструкции (обычно макросы) могут привести к ошибочной документации.
Q_OBJECT
не должно вызывать проблем, потому что чуть дальше написано:
Q_OBJECT
макрос, однако, является исключением: QDoc распознает эту конкретную нестандартную конструкцию, поэтому нет необходимости указывать ее с помощьюCpp.ignoredirectives
переменная.
В любом случае я включаю qt-cpp-defines.qdocconf
в моем qdocconf
файл.
Я также попытался добавить вручную Q_OBJECT
в список игнорируемых
Cpp.ignoredirectives += Q_OBJECT
но результат тот же.
Я испытываю описанную проблему под Windows 10 и Ubuntu 17. Под Windows 7 я не могу выполнить qdoc.exe
совсем.
Какова правильная конфигурация qdocconf
преодолеть эту проблему?
Для быстрого воспроизведения (в реальной ситуации объявления и реализации разделены и добавлены правильные комментарии), пожалуйста, обратите внимание на следующую настройку:
foo.h
#include <QObject>
class Foo : public QObject
{
// Q_OBJECT // <-- uncomment this to break QDoc
public:
Foo() {}
void boo() {}
protected:
void moo() {}
};
foo.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 ()
void boo ()
Защищенные функции
void moo ()
Подробное описание
Документация по функциям
Foo :: Foo ()
По умолчанию создается экземпляр Foo.
void Foo :: boo ()
[защищено] void Foo :: moo ()
Q_OBJECT
)Раскомментировать Q_OBJECT
макрос и бег qdoc.exe
снова дает следующий результат:
- Foo
содержание
- Подробное описание
Подробное описание
ВАЖНЫЙ: Foo
, moo
а также boo
пропали.
Единственное решение, которое я придумал, — это добавить следующие директивы препроцессора в Q_OBJECT
макрос:
#ifndef Q_QDOC
Q_OBJECT
#endif //Q_QDOC
Q_QDOC
определяется во включенном qt-cpp-defines.qdocconf
, так QDoc
макрос пропускается, но он не определен в системе сборки, и код компилируется как обычно.
Других решений пока нет …