D-Bus has an extensible type system based on a few primitives and composition of the primitives in arrays and structures. Qt D-Bus implements the interface to that type system through the QDBusArgument class, allowing user programs to send and receive practically every C++ type over the bus.
The primitive types are supported natively by QDBusArgument and need no special customization to be sent or received. They are listed below, along with the C++ class they relate to:
| 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 |
Aside from the primitive types, QDBusArgument also supports two non-primitive types natively, due to their widespread use in Qt applications: QStringList and QByteArray .
D-Bus specifies three types of aggregations of primitive types that allow one to create compound types. They are
ARRAY
,
STRUCT
and maps/dictionaries.
Arrays are sets of zero or more elements of the same type, while structures are a set of a fixed number of elements, each of any type. Maps or dictionaries are implemented as arrays of a pair of elements, so there can be zero or more elements in one map.
In order to use one's own type with Qt D-Bus, the type has to be declared as a Qt meta-type with the
Q_DECLARE_METATYPE
() macro and registered with the
qDBusRegisterMetaType
() function. The streaming operators
operator>>
and
operator<<
will be automatically found by the registration system.
Qt D-Bus provides template specializations for arrays and maps for use with Qt's
容器类
,譬如
QMap
and
QList
, so it is not necessary to write the streaming operator functions for those. For structures Qt provides generic specializations mapping to and from
std::tuple
. In order to use a custom type instead or for other types the operators have to be explicitly implemented.
见文档编制为 QDBusArgument for examples for structures, arrays and maps.
All of the Qt D-Bus types (primitives and user-defined alike) can be used to send and receive messages of all types over the bus.
警告: You may not use any type that is not on the list above, including typedefs to the types listed. This also includes QList < QVariant > 和 QMap < QString , QVariant >.