Qt D-Bus 类型系统

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 >.