Система типов Qt D-Bus
D-Bus имеет расширяемую систему типов, основанную на нескольких примитивах и композиции примитивов в массивах и структурах. Qt D-Bus реализует интерфейс к этой системе типов через класс QDBusArgument, позволяя пользовательским программам отправлять и получать практически любые типы C++ по шине.
Примитивные типы
Примитивные типы поддерживаются QDBusArgument по умолчанию и не требуют специальной настройки для отправки или получения. Они перечислены ниже вместе с соответствующим классом C++:
| Тип Qt | Эквивалентный тип D-Bus |
|---|---|
| uchar | BYTE |
| bool | BOOLEAN |
| short | INT16 |
| ushort | UINT16 |
| int | INT32 |
| uint | UINT32 |
| qlonglong | INT64 |
| qulonglong | UINT64 |
| double | DOUBLE |
| QString | STRING |
| QDBusVariant | VARIANT |
| QDBusObjectPath | OBJECT_PATH |
| QDBusSignature | SIGNATURE |
Помимо примитивных типов, QDBusArgument также по умолчанию поддерживает два не примитивных типа из-за их широкого использования в приложениях Qt: QStringList и QByteArray.
Составные типы
D-Bus определяет три типа агрегаций примитивных типов, которые позволяют создавать составные типы. Это ARRAY, STRUCT и карты/словари.
Массивы представляют собой наборы одного или нескольких элементов одного типа, в то время как структуры — это набор фиксированного числа элементов, каждый из которых может быть любого типа. Карты или словари реализуются как массивы пар элементов, поэтому в одной карте может быть ноль или более элементов.
Расширение системы типов
Для использования собственного типа с Qt D-Bus, тип должен быть объявлен как метатип Qt с помощью макроса Q_DECLARE_METATYPE() и зарегистрирован с помощью функции qDBusRegisterMetaType(). Операторы потокового ввода-вывода operator>> и operator<< будут автоматически найдены системой регистрации.
Qt D-Bus предоставляет шаблоны специализации для массивов и карт для использования с контейнерными классами Qt, такими как QMap и QList, поэтому нет необходимости писать функции операторов потокового ввода-вывода для них. Для других типов, и особенно для типов, реализующих структуры, операторы должны быть явно реализованы.
Примеры структур, массивов и карт см. в документации для QDBusArgument.
Система типов в использовании
Все типы Qt D-Bus (примитивные и пользовательские) могут использоваться для отправки и получения сообщений всех типов по шине.
Предупреждение: Вы не можете использовать ни один тип, который не указан в списке выше, включая typedef для указанных типов. Это также относится к QList<QVariant> и QMap<QString,QVariant>.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qdbustypesystem.html