Qt D-Bus 类型系统#

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

原始类型#

原始类型由 QDBusArgument 原生支持,发送或接收时无需特殊定制。以下是列表,包括它们对应的 C++ 类:

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

除了原始类型外,QDBusArgument 还因其在 Qt 应用程序中的广泛应用而原生支持两种非原始类型:QStringList 和 QByteArray。

复合类型#

D-Bus 指定了三种原始类型的聚合类型,允许创建复合类型。它们是 ARRAYSTRUCT 和映射/字典。

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

扩展类型系统#

为了使用自己的类型与 Qt D-Bus 一起使用,必须使用 Q_DECLARE_METATYPE() 宏将该类型声明为 Qt 元类型,并使用 qDBusRegisterMetaType() 函数进行注册。注册系统将自动找到流操作符 operator>>operator<<

Qt D-Bus 为 Qt 的容器类(如 QMap 和 QList)提供了数组和映射的模板特化,因此无需为这些类编写流操作符函数。对于其他类型,尤其是实现结构的类型,必须显式实现操作符。

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

使用的类型系统#

Qt D-Bus 中的所有类型(包括原始类型和用户定义类型)都可以用来在总线上发送和接收各种类型的消息。

警告

您不能使用列表中没有的类型,包括到列表中类型的 typedefs。这还包括 QList<QVariant>QMap<QString,QVariant>