Система типов 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 (как примитивные, так и определённые пользователем) могут использоваться для отправки и получения сообщений всех типов по шине.
Предупреждение: Нельзя использовать типы, которые отсутствуют в списке выше, включая псевдонимы типов из этого списка. Это также относится к QList<QVariant> и QMap<QString,QVariant>.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qdbustypesystem.html