The Qt D-Bus Type System

D-Bus具有一个可扩展类型系统, 系统基于一些基本类型以及基本类型在数组和结构中的组合. Qt D-Bus 通过 QDBusArgument 类实现了与该类型系统的接口, 允许用户程序通过总线发送和接收几乎所有C++类型.

基本类型

QDBusArgument 支持基本类型, 无需特殊定制即可发送或接收. 下面列出了它们, 以及它们所涉及的C++类:

Qt typeD-Bus equivalent type
ucharBYTE
boolBOOLEAN
shortINT16
ushortUINT16
intINT32
uintUINT32
qlonglongINT64
qulonglongUINT64
doubleDOUBLE
QStringSTRING
QDBusVariantVARIANT
QDBusObjectPathOBJECT_PATH
QDBusSignatureSIGNATURE

除了基本类型之外, QDBusArgument 还支持两种非基本类型, 因为它们在Qt应用程序中广泛使用: QStringList and QByteArray.

复合类型

D-Bus 指定了三种类型的基本类型组合, 允许创建复合类型. 它们是 ARRAY, STRUCT 和 maps/dictionaries.

数组是由零个或多个相同类型的元素组成的集合, 而结构是由固定数量的元素组成, 每个元素可以是任何类型. maps或dictionaries被实现为一对元素的数组, 因此一个map中可以有零个或多个元素.

扩展类型系统

在Qt D-Bus中自定义类型时, 必须使用 Q_DECLARE_METATYPE() 宏将类型声明为Qt元类型, 并使用 qDBusRegisterMetaType() 函数注册. 流操作 operator>> and operator<< 将由注册系统自动查找.

Qt D-Bus 为数组和map提供模板专用化, 以便与Qt的 容器类, 如 QMap and QList, 因此没有必要为这些类编写流操作符函数. 对于其他类型, 特别是实现结构的类型, 必须显式实现运算符.

有关结构、数组和map的示例, 参见 QDBusArgument.

类型系统

所有Qt D-Bus类型(基本类型和自定义类型)都可以通过总线发送和接收.

警告: 你不能使用上面列表中没有的任何类型, 包括typedef定义的类型. 这也包括 QList<QVariant> 和 QMap<QString,QVariant>.