Почему Q_OBJECT ломает QDoc?

После обновления с 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 пропали.

4

Решение

Единственное решение, которое я придумал, — это добавить следующие директивы препроцессора в Q_OBJECT макрос:

#ifndef Q_QDOC
Q_OBJECT
#endif //Q_QDOC

Q_QDOC определяется во включенном qt-cpp-defines.qdocconf, так QDoc макрос пропускается, но он не определен в системе сборки, и код компилируется как обычно.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]