Spec-Zone.ru › Qt 5.15

Введение в QDoc

QDoc — инструмент, используемый разработчиками Qt для генерации документации программных проектов. Он работает, извлекая комментарии QDoc из исходных файлов проекта и затем форматируя эти комментарии в виде страниц HTML или документов DITA XML. QDoc находит комментарии QDoc в .cpp файлах и в .qdoc файлах. QDoc не ищет комментарии QDoc в .h файлах. Комментарий QDoc всегда начинается с восклицательного знака (!)). Например:

    / *!
        \class QObject
        \brief The QObject class is the base class of all Qt objects.

        \ingroup objectmodel

        \reentrant

        QObject is the heart of the Qt \l{Object Model}. The
        central feature in this model is a very powerful mechanism
        for seamless object communication called \l{signals and
        slots}. You can connect a signal to a slot with connect()
        and destroy the connection with disconnect(). To avoid
        never ending notification loops you can temporarily block
        signals with blockSignals(). The protected functions
        connectNotify() and disconnectNotify() make it possible to
        track connections.

        QObjects organize themselves in \l {Object Trees &
        Ownership} {object trees}. When you create a QObject with
        another object as parent, the object will automatically
        add itself to the parent's \c children() list. The parent
        takes ownership of the object. It will automatically
        delete its children in its destructor. You can look for an
        object by name and optionally type using findChild() or
        findChildren().

        Every object has an objectName() and its class name can be
        found via the corresponding metaObject() (see
        QMetaObject::className()). You can determine whether the
        object's class inherits another class in the QObject
        inheritance hierarchy by using the \c inherits() function.

    ....
* /

Из комментария QDoc выше QDoc генерирует страницу справки класса QObject.

В данном руководстве объясняется, как использовать команды QDoc в комментариях QDoc для встраивания хорошей документации в ваши исходные файлы. Также объясняется, как создать файл конфигурации QDoc, который вы передадите QDoc в командной строке.

Запуск QDoc

Имя программы QDoc — qdoc. Чтобы запустить QDoc из командной строки, укажите имя файла конфигурации:

$ ../../bin/qdoc ./config.qdocconf

QDoc распознаёт суффикс .qdocconf как файл конфигурации QDoc. В файле конфигурации вы указываете QDoc, где найти исходные файлы проекта, заголовочные файлы и .qdoc файлы. Также в нём вы указываете, какой тип выходных данных сгенерировать (HTML, DITA XML,...) и куда поместить сгенерированную документацию. Файл конфигурации также содержит другую информацию для QDoc.

См. Файл конфигурации QDoc для инструкций по настройке файла конфигурации QDoc.

Запуск QDoc в режиме единого выполнения

Начиная с Qt 5.5, доступен новый способ запуска QDoc, который сокращает время генерации документации Qt5 на 90%. Новый способ запуска QDoc — режим единого выполнения. Режим единого выполнения в настоящее время недоступен в системе сборки Qt5, которая по-прежнему использует режим стандартный. Режим единого выполнения доступен только при самостоятельном запуске QDoc, что вам часто понадобится при документировании вашего модуля и интеграции вашей документации с другими модулями Qt.

Чтобы запустить QDoc в режиме единого выполнения, добавьте -single-exec в командную строку и передайте QDoc мастер-файл qdocconf , который просто представляет собой список путей к файлам qdocconf всех модулей Qt5. Например:

/Users/me/qt5/qtbase/bin/qdoc -outputdir /Users/me/qt5/qtbase/doc -installdir /Users/me/qt5/qtbase/doc /Users/me/qt5/master.qdocconf -single-exec

Файл qdocconf, master.qdocconf, просто перечисляет файлы qdocconf для всех модулей Qt5, которые необходимо обработать:

/Users/me/qt5/qtbase/src/corelib/doc/qtcore.qdocconf
/Users/me/qt5/qtbase/src/network/doc/qtnetwork.qdocconf
/Users/me/qt5/qtbase/src/sql/doc/qtsql.qdocconf
/Users/me/qt5/qtbase/src/xml/doc/qtxml.qdocconf
/Users/me/qt5/qtbase/src/testlib/doc/qttestlib.qdocconf
/Users/me/qt5/qtbase/src/concurrent/doc/qtconcurrent.qdocconf
/Users/me/qt5/qtbase/src/gui/doc/qtgui.qdocconf
/Users/me/qt5/qtbase/src/platformheaders/doc/qtplatformheaders.qdocconf
/Users/me/qt5/qtbase/src/widgets/doc/qtwidgets.qdocconf
/Users/me/qt5/qtbase/src/opengl/doc/qtopengl.qdocconf
/Users/me/qt5/qtbase/src/printsupport/doc/qtprintsupport.qdocconf
/Users/me/qt5/qtbase/src/tools/qdoc/doc/config/qdoc.qdocconf
/Users/me/qt5/qtbase/qmake/doc/qmake.qdocconf
/Users/me/qt5/qtsvg/src/svg/doc/qtsvg.qdocconf
/Users/me/qt5/qtxmlpatterns/src/xmlpatterns/doc/qtxmlpatterns.qdocconf
/Users/me/qt5/qtdeclarative/src/qml/doc/qtqml.qdocconf
/Users/me/qt5/qtdeclarative/src/quick/doc/qtquick.qdocconf
/Users/me/qt5/qtquickcontrols/src/controls/doc/qtquickcontrols.qdocconf
/Users/me/qt5/qtquickcontrols/src/layouts/doc/qtquicklayouts.qdocconf
/Users/me/qt5/qtquickcontrols/src/dialogs/doc/qtquickdialogs.qdocconf
/Users/me/qt5/qtmultimedia/src/multimedia/doc/qtmultimedia.qdocconf
/Users/me/qt5/qtmultimedia/src/multimediawidgets/doc/qtmultimediawidgets.qdocconf
/Users/me/qt5/qtactiveqt/src/activeqt/doc/activeqt.qdocconf
/Users/me/qt5/qtsensors/src/sensors/doc/qtsensors.qdocconf
/Users/me/qt5/qtwebkit/Source/qtwebkit.qdocconf
/Users/me/qt5/qttools/src/assistant/help/doc/qthelp.qdocconf
/Users/me/qt5/qttools/src/assistant/assistant/doc/qtassistant.qdocconf
/Users/me/qt5/qttools/src/designer/src/uitools/doc/qtuitools.qdocconf
/Users/me/qt5/qttools/src/designer/src/designer/doc/qtdesigner.qdocconf
/Users/me/qt5/qttools/src/linguist/linguist/doc/qtlinguist.qdocconf
/Users/me/qt5/qtwebkit-examples/doc/qtwebkitexamples.qdocconf
/Users/me/qt5/qtimageformats/src/imageformats/doc/qtimageformats.qdocconf
/Users/me/qt5/qtgraphicaleffects/src/effects/doc/qtgraphicaleffects.qdocconf
/Users/me/qt5/qtscript/src/script/doc/qtscript.qdocconf
/Users/me/qt5/qtscript/src/scripttools/doc/qtscripttools.qdocconf
/Users/me/qt5/qtserialport/src/serialport/doc/qtserialport.qdocconf
/Users/me/qt5/qtdoc/doc/config/qtdoc.qdocconf

Почему стандартный режим медленный

В настоящее время система сборки Qt5 не использует режим единого выполнения QDoc для генерации документации Qt5. Она запускает QDoc в стандартном режиме. Стандартный режим возник, потому что это был самый простой способ адаптировать QDoc Qt4 для работы с модульной структурой Qt в Qt5. В Qt4 QDoc выполнялся один раз над всеми исходными кодами Qt4 для генерации HTML-документации для Qt. При генерации документации Qt Qt4 QDoc также генерировал файл индекса для Qt. Этот файл индекса предназначался для использования в последующих запусках QDoc для генерации HTML-документации для других программных библиотек/продуктов, основанных на Qt. Файл индекса Qt позволял QDoc связывать документацию, написанную для этих других библиотек/продуктов, с документацией Qt4.

Когда появился Qt5, Qt был разделен на модули. С тех пор было добавлено множество новых модулей Qt. Начиная с версии 5.5, в Qt5 насчитывается более 40 отдельных модулей, каждый со своей документацией, которая ссылается на (зависит от) документации других модулей Qt.

В стандартном режиме QDoc выполняется дважды для каждого модуля. Первый запуск QDoc для конкретного модуля Qt анализирует все исходные файлы модуля, а затем использует информацию для генерации файла индекса модуля. Это называется фазой подготовки, потому что он подготавливает файл индекса модуля. Второй запуск QDoc для модуля также анализирует все исходные файлы модуля и генерирует страницы документации модуля. Это называется фазой генерации, потому что она генерирует документацию модуля.

Документация модуля, скорее всего, будет содержать HTML-ссылки на документацию одного или нескольких других модулей Qt. Например, большинство модулей Qt5 содержат ссылки на документацию в QtCore. Когда модуль Qt содержит ссылки в документацию другого модуля Qt, этот модуль считается зависимым от этих других модулей Qt. Следовательно, при выполнении QDoc фазы генерации для этого модуля он также должен загрузить файлы индексов этих модулей, чтобы он мог создать эти элементы.

Таким образом, когда система сборки Qt генерирует документацию Qt, она сначала запускает QDoc один раз для каждого модуля, чтобы выполнить фазу подготовки, чтобы сгенерировать все файлы индексов. Затем она запускает QDoc один раз для каждого модуля, чтобы выполнить фазу генерации, где она использует зависимые файлы индексов для генерации документации модуля, включая любые межмодульные ссылки, которые она находит. Каждый запуск QDoc, как фаза подготовки, так и фаза генерации, анализирует все исходные файлы, включенные в модуль, а в фазе генерации также анализирует файлы индексов зависимых модулей. Ничего не сохраняется и не сохраняемо между запусками QDoc.

Почему режим единого выполнения намного быстрее

Как следует из названия, режим единого выполнения использует один процесс QDoc для генерации всей документации Qt5. Один процесс QDoc все равно выполняет фазу подготовки для каждого модуля, а затем фазу генерации для каждого модуля, но есть несколько различий. Он начинает с чтения мастер-файла qdocconf. Затем он читает каждый файл qdocconf в мастер-списке и выполняет фазу подготовки для каждого модуля. Во время фазы подготовки все исходные файлы модуля анализируются для построения синтаксического дерева модуля. Файл индекса модуля затем генерируется, хотя QDoc не будет повторно читать файлы индексов в фазе генерации. Важное различие здесь заключается в том, что синтаксическое дерево модуля сохраняется после генерации файла индекса, так что после выполнения фазы подготовки для всех модулей QDoc по-прежнему имеет все построенные синтаксические деревья.

Затем QDoc обрабатывает каждый модуль снова для фазы генерации. Но теперь QDoc не нужно повторно анализировать исходные файлы каждого модуля, потому что синтаксическое дерево модуля по-прежнему находится в памяти. QDoc также не нужно повторно читать файлы индексов зависимых модулей, опять же, потому что у него все еще есть синтаксические деревья этих модулей в памяти. Осталось только пройтись по синтаксическому дереву каждого модуля, чтобы сгенерировать страницы документации.

Таким образом, QDoc анализирует каждый исходный файл один раз и только один раз и не нуждается в чтении файлов индексов. Именно это делает режим единого выполнения намного быстрее, чем стандартный режим. Ожидается, что система сборки Qt в конечном итоге запустит QDoc в режиме единого выполнения. Однако могут потребоваться изменения в мастер-файле qdocconf, поэтому описанный выше метод запуска QDoc в режиме единого выполнения может потребовать изменения, следите за обновлениями.

Как работает QDoc

QDoc начинает с чтения файла конфигурации, который вы указали в командной строке. Он сохраняет все переменные из файла конфигурации для последующего использования. Одна из первых переменных, которую он использует, — outputformats. Эта переменная сообщает QDoc, какие генераторы вывода будут запущены. Значение по умолчанию — HTML, поэтому если вы не зададите outputformats в вашем файле конфигурации, QDoc сгенерирует выходные данные HTML. Это обычно то, что вам нужно, но вы также можете указать DITAXML, чтобы получить выходные данные DITA XML вместо этого.

Далее QDoc использует значения переменной headerdirs и/или переменной headers, чтобы найти и проанализировать все заголовочные файлы вашего проекта. QDoc не сканирует заголовочные файлы на наличие комментариев QDoc. Он анализирует заголовочные файлы, чтобы создать главное дерево всех элементов, которые должны быть задокументированы, другими словами, элементов, для которых QDoc должен найти комментарии QDoc.

После анализа всех заголовочных файлов и построения главного дерева элементов для документирования, QDoc использует значение переменной sourcedirs и/или значение переменной sources, чтобы найти и проанализировать все .cpp и .qdoc файлы вашего проекта. Это те файлы, которые QDoc сканирует на наличие комментариев QDoc. Помните, что комментарий QDoc начинается с восклицательного знака: /*! .

Для каждого найденного комментария QDoc он ищет в главном дереве элемент, к которому относится документация. Затем он интерпретирует команды QDoc в комментарии и сохраняет интерпретированные команды и текст комментария в узле дерева для элемента.

Наконец, QDoc обходит главное дерево. Для каждого узла, если узел имеет сохранённую документацию, QDoc вызывает генератор вывода, указанный переменной outputformats, чтобы отформатировать и записать документацию в каталог, указанный в файле конфигурации в переменной outputdir.

Типы команд

QDoc интерпретирует три типа команд:

  • Команды тем
  • Команды контекста
  • Команды разметки

Команды тем идентифицируют элемент, который вы документируете, например, класс C++, функцию, тип или дополнительную страницу текста, которая не соответствует базовому элементу C++.

Команды контекста сообщают QDoc, как документируемый элемент связан с другими документированными элементами, например, ссылками на предыдущую и следующую страницы, включением в группы страниц или модули библиотек. Команды контекста также могут предоставлять информацию о документированном элементе, которую QDoc не может получить из исходных файлов, например, является ли элемент потокобезопасным, является ли это перегруженной или переопределенной функцией или она устарела.

Команды разметки сообщают QDoc, как должны отображаться элементы текста и изображений в документе, или о структуре оглавления документа.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/01-qdoc-manual.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API