本页内容

Qt D-Bus 类型系统

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

基本类型

QDBusArgument 原生支持这些基本类型,发送或接收时无需进行特殊定制。以下列出了这些基本类型及其对应的 C++ 类:

Qt 类型D-Bus 对应类型
ucharBYTE
boolBOOLEAN
shortINT16
ushortUINT16
intINT32
uintUINT32
qlonglongINT64
qulonglongUINT64
doubleDOUBLE
QString字符串
QDBusVariantVARIANT
QDBusObjectPathOBJECT_PATH
QDBusSignature签名

除了基本类型外,由于它们在 Qt 应用程序中被广泛使用,QDBusArgument 还原生支持两种非基本类型:QStringList 和QByteArray 。

复合类型

D-Bus 规定了三种基本类型的聚合形式,允许用户创建复合类型。它们分别是ARRAY 、STRUCT 以及映射/字典。

数组是由零个或多个相同类型的元素组成的集合,而结构体则是由固定数量的元素组成的集合,每个元素可以是任意类型。映射或字典被实现为由元素对组成的数组,因此一个映射中可以包含零个或多个元素。

扩展类型系统

若要在Qt D-Bus 中使用自定义类型,必须使用Q_DECLARE_METATYPE()宏将该类型声明为Qt元类型,并通过qDBusRegisterMetaType()函数进行注册。流操作符operator>> 和operator<< 将被注册系统自动识别。

Qt D-Bus 该库为数组和映射提供了模板特化实现,可与 Qt的容器类(如QMap 和QList )配合使用,因此无需为这些类型编写流式运算符函数。对于结构体,Qt 提供了与std::tuple 相互映射的通用特化实现。若要使用自定义类型或针对其他类型,则必须显式实现这些运算符。

有关结构体、数组和映射的示例,请参阅QDBusArgument 的文档。

类型系统在实际应用中的使用

所有Qt D-Bus 类型(无论是基本类型还是用户定义类型)均可用于通过总线发送和接收所有类型的消息。

警告:您 不得使用上述列表中未列出的任何类型,包括将typedefs 转换为列表中列出的类型。这还包括QList<QVariant> 以及QMap<QString,QVariant>。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.