The Qt D-Bus Type System
D-Bus具有一个可扩展类型系统, 系统基于一些基本类型以及基本类型在数组和结构中的组合. Qt D-Bus 通过 QDBusArgument 类实现了与该类型系统的接口, 允许用户程序通过总线发送和接收几乎所有C++类型.
基本类型
QDBusArgument 支持基本类型, 无需特殊定制即可发送或接收. 下面列出了它们, 以及它们所涉及的C++类:
Qt type | D-Bus equivalent type |
---|---|
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 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>.