本页内容

QDBusArgument Class

QDBusArgument 类用于对 D-Bus 参数进行序列化和反序列化。更多内容...

头文件: #include <QDBusArgument>
CMake: find_package(Qt6 REQUIRED COMPONENTS DBus)
target_link_libraries(mytarget PRIVATE Qt6::DBus)
qmake: QT += dbus

公共类型

enum ElementType { BasicType, VariantType, ArrayType, StructureType, MapType, …, UnknownType }

公共函数

QDBusArgument()
QDBusArgument(const QDBusArgument &other)
~QDBusArgument()
QVariant asVariant() const
bool atEnd() const
void beginArray() const
void beginArray(QMetaType id)
void beginMap() const
void beginMap(QMetaType keyMetaType, QMetaType valueMetaType)
void beginMapEntry()
void beginMapEntry() const
void beginStructure()
void beginStructure() const
QDBusArgument::ElementType currentType() const
void endArray()
void endArray() const
void endMap()
void endMap() const
void endMapEntry()
void endMapEntry() const
void endStructure()
void endStructure() const
void swap(QDBusArgument &other)
QDBusArgument &operator<<(uchar arg)
QDBusArgument &operator<<(bool arg)
QDBusArgument &operator<<(const QByteArray &arg)
QDBusArgument &operator<<(const QDBusVariant &arg)
QDBusArgument &operator<<(const QString &arg)
QDBusArgument &operator<<(const QStringList &arg)
QDBusArgument &operator<<(double arg)
QDBusArgument &operator<<(int arg)
QDBusArgument &operator<<(qlonglong arg)
QDBusArgument &operator<<(qulonglong arg)
QDBusArgument &operator<<(short arg)
QDBusArgument &operator<<(uint arg)
QDBusArgument &operator<<(ushort arg)
QDBusArgument &operator=(const QDBusArgument &other)
const QDBusArgument &operator>>(uchar &arg) const
const QDBusArgument &operator>>(QByteArray &arg) const
const QDBusArgument &operator>>(QDBusVariant &arg) const
const QDBusArgument &operator>>(QString &arg) const
const QDBusArgument &operator>>(QStringList &arg) const
const QDBusArgument &operator>>(bool &arg) const
const QDBusArgument &operator>>(double &arg) const
const QDBusArgument &operator>>(int &arg) const
const QDBusArgument &operator>>(qlonglong &arg) const
const QDBusArgument &operator>>(qulonglong &arg) const
const QDBusArgument &operator>>(short &arg) const
const QDBusArgument &operator>>(uint &arg) const
const QDBusArgument &operator>>(ushort &arg) const
QMetaType qDBusRegisterMetaType()
T qdbus_cast(const QDBusArgument &arg)

详细说明

该类用于通过 D-Bus 向远程应用程序发送参数并接收返回值。D-Bus 提供了一个可扩展的类型系统,该系统基于几种基本类型及其组合。有关该类型系统的更多信息,请参阅Qt D-Bus 类型系统页面。

QDBusArgument 是Qt D-Bus 类型系统中的核心类,提供了用于对基本类型进行序列化和反序列化的函数。随后,通过将一个或多个基本类型组合成数组、字典或结构体,即可创建复合类型。

以下示例演示了如何使用Qt D-Bus 类型系统构建一个包含整数和字符串的结构体:

struct MyStructure
{
    int count;
    QString name;

    // ...
};
Q_DECLARE_METATYPE(MyStructure)

// Marshall the MyStructure data into a D-Bus argument
QDBusArgument &operator<<(QDBusArgument &argument, const MyStructure &myStruct)
{
    argument.beginStructure();
    argument << myStruct.count << myStruct.name;
    argument.endStructure();
    return argument;
}

// Retrieve the MyStructure data from the D-Bus argument
const QDBusArgument &operator>>(const QDBusArgument &argument, MyStructure &myStruct)
{
    argument.beginStructure();
    argument >> myStruct.count >> myStruct.name;
    argument.endStructure();
    return argument;
}

在将该类型用于 QDBusArgument 之前,必须先通过qDBusRegisterMetaType() 对其进行注册。因此,您应在程序中的某个位置添加以下代码:

qDBusRegisterMetaType<MyStructure>();

注册完成后,该类型即可用于传出方法调用(通过QDBusAbstractInterface::call()进行设置)、已注册对象的信号发射,或来自远程应用程序的传入调用。

需要特别注意的是,对于结构体,operator<< 和operator>> 流处理函数在读写(序列化和反序列化)时,必须始终生成相同数量的条目,否则调用和信号可能会开始无声地失败。

以下示例说明了在可能包含无效数据的类中这种错误用法:

//bad code
    // Wrongly marshall the MyTime data into a D-Bus argument
    QDBusArgument &operator<<(QDBusArgument &argument, const MyTime &mytime)
    {
        argument.beginStructure();
        if (mytime.isValid)
            argument << true << mytime.hour
                     << mytime.minute << mytime.second;
        else
            argument << false;
        argument.endStructure();
        return argument;
    }

在此示例中,operator<< 和operator>> 函数可能产生不同数量的读/写操作。这可能会导致Qt D-Bus 类型系统产生混淆,因此应予以避免。

另请参阅 QDBusAbstractInterface 、 Qt D-Bus 类型系统、使用适配器以及qdbus_cast()。

成员类型文档

enum QDBusArgument::ElementType

此枚举描述了参数所包含的元素的类型。

常量值描述
QDBusArgument::BasicType0QVariant 能够识别的基本元素。以下类型被视为基本类型:bool、byte、short、ushort、int、uint、qint64、quint64、double、QString 、QByteArray 、QDBusObjectPath 、QDBusSignature
QDBusArgument::VariantType1变体元素(QDBusVariant )
QDBusArgument::ArrayType2数组元素,通常由QList<T> 表示。注意:QByteArray 和关联映射不被视为数组,即使 D-Bus 协议将其作为数组进行传输。
QDBusArgument::StructureType3由结构体表示的自定义类型,例如QDateTime 、QPoint 等。
QDBusArgument::MapType4关联容器,如QMap<Key, Value> 或QHash<Key, Value>
QDBusArgument::MapEntryType5关联容器中的一个条目:键和值共同构成一个映射条目类型。
QDBusArgument::UnknownType-1类型未知,或者已到达列表末尾。

另请参阅 currentType()。

成员函数文档

QDBusArgument::QDBusArgument()

构建一个空的 QDBusArgument 参数。

空的 QDBusArgument 对象不允许进行读取或写入操作。

QDBusArgument::QDBusArgument(const QDBusArgument &other)

创建一个other QDBusArgument对象的副本。

因此,从此刻起,这两个对象将保持相同的状态。QDBusArgument 对象是显式共享的,因此对其中任意一个副本所做的任何修改都会影响另一个副本。

[noexcept] QDBusArgument::~QDBusArgument()

释放与该QDBusArgument 对象关联的资源。

QVariant QDBusArgument::asVariant() const

以QVariant 的形式返回当前参数。基本类型将被解码并以QVariant 的形式返回,但对于复杂类型,该函数将返回一个位于QVariant 中的QDBusArgument 对象。解码参数的责任在于调用方(例如,通过在其内部调用asVariant())。

例如,如果当前参数是 INT32,该函数将返回一个QVariant ,其参数类型为QMetaType::Int 。对于 INT32 数组,它将返回一个QVariant ,其中包含QDBusArgument 。

如果发生错误,或者没有更多的参数需要解码(即已到达参数列表末尾),该函数将返回一个无效的QVariant 。

另请参阅 atEnd()。

bool QDBusArgument::atEnd() const

如果从该QDBusArgument 中已无更多元素可提取,则返回true 。该函数通常用于由beginMap()和beginArray()返回的QDBusArgument 对象中。

void QDBusArgument::beginArray() const

递归访问 D-Bus 数组,以便提取数组元素。

该函数通常用于operator>> 流操作符中,如下例所示:

// Extract a MyArray array of MyElement elements
const QDBusArgument &operator>>(const QDBusArgument &argument, MyArray &myArray)
{
    argument.beginArray();
    myArray.clear();

    while (!argument.atEnd()) {
        MyElement element;
        argument >> element;
        myArray.append(element);
    }

    argument.endArray();
    return argument;
}

如果要反序列化的类型是QList ,或是任何接受一个模板参数的Qt容器类,则无需为其声明operator>> 函数,因为Qt D-Bus 提供了用于反序列化数据的通用模板。STL的序列容器(如std::list 、std::vector 等)也适用此规则。

另请参阅 atEnd()、beginStructure() 以及beginMap()。

void QDBusArgument::beginArray(QMetaType id)

打开一个新的 D-Bus 数组,该数组适用于追加元类型为id 的元素。

该函数通常用于operator<< 的流操作符中,如下例所示:

// Append an array of MyElement types
QDBusArgument &operator<<(QDBusArgument &argument, const MyArray &myArray)
{
    argument.beginArray(qMetaTypeId<MyElement>());
    for (const auto &element : myArray)
        argument << element;
    argument.endArray();
    return argument;
}

如果要进行序列化的类型是QList ,或是任何接受一个模板参数的QtXML容器类,则无需为其声明operator<< 函数,因为Qt D-Bus 提供了用于完成数据序列化工作的通用模板。STL的序列容器(如std::list 、std::vector 等)也同样适用。

另请参阅 endArray()、beginStructure() 和beginMap()。

void QDBusArgument::beginMap() const

递归访问 D-Bus 映射,以便提取映射中的元素。

该函数通常用于operator>> 流操作符中,如下例所示:

// Extract a MyDictionary map that associates integers to MyElement items
const QDBusArgument &operator>>(const QDBusArgument &argument, MyDictionary &myDict)
{
    argument.beginMap();
    myDict.clear();

    while (!argument.atEnd()) {
        int key;
        MyElement value;
        argument.beginMapEntry();
        argument >> key >> value;
        argument.endMapEntry();
        myDict.insert(key, value);
    }

    argument.endMap();
    return argument;
}

如果要反序列化的类型是QMap 或QHash ,则无需为其声明operator>> 函数,因为Qt D-Bus 提供了用于反序列化数据的通用模板。

另请参阅 endMap()、beginStructure()、beginArray() 以及beginMapEntry()。

void QDBusArgument::beginMap(QMetaType keyMetaType, QMetaType valueMetaType)

打开一个适合追加元素的新 Qt D-Bus 映射。映射是一种容器,用于将一个条目(键)与另一个条目(值)相关联,例如 Qt 中的QMap 或QHash 。映射中键和值元类型的 ID 必须分别传递给keyMetaType 和valueMetaType 。

该函数通常用于operator<< 流操作符中,如下例所示:

// Append a dictionary that associates ints to MyValue types
QDBusArgument &operator<<(QDBusArgument &argument, const MyDictionary &myDict)
{
    argument.beginMap(QMetaType::fromType<int>(), QMetaType::fromType<MyValue>());
    MyDictionary::const_iterator i;
    for (i = myDict.cbegin(); i != myDict.cend(); ++i) {
        argument.beginMapEntry();
        argument << i.key() << i.value();
        argument.endMapEntry();
    }
    argument.endMap();
    return argument;
}

对于QHash 或 std::map 等关联容器,通常无需提供operator<< 或operator>> 函数,因为Qt D-Bus 提供了用于数据序列化的泛型模板。

另请参阅 endMap()、beginStructure()、beginArray() 以及beginMapEntry()。

void QDBusArgument::beginMapEntry()

打开一个适合追加键值条目的 D-Bus 映射条目。此函数仅在已通过beginMap() 打开映射时才有效。

有关此函数的使用示例,请参阅beginMap()。

另请参阅 endMapEntry() 和beginMap()。

void QDBusArgument::beginMapEntry() const

递归访问 D-Bus 映射条目,以便提取键值对。

有关此函数通常使用方式的示例,请参阅beginMap()。

另请参阅 endMapEntry() 和beginMap()。

void QDBusArgument::beginStructure()

打开一个新的 D-Bus 结构,该结构适合追加新参数。

该函数通常用于operator<< 流操作符中,如下例所示:

QDBusArgument &operator<<(QDBusArgument &argument, const MyStructure &myStruct)
{
    argument.beginStructure();
    argument << myStruct.member1 << myStruct.member2;
    argument.endStructure();
    return argument;
}

结构体可以包含其他结构体,因此以下代码也是有效的:

QDBusArgument &operator<<(QDBusArgument &argument, const MyStructure &myStruct)
{
    argument.beginStructure();
    argument << myStruct.member1 << myStruct.member2;

    argument.beginStructure();
    argument << myStruct.member3.subMember1 << myStruct.member3.subMember2;
    argument.endStructure();

    argument << myStruct.member4;
    argument.endStructure();
    return argument;
}

另请参阅 endStructure()、beginArray() 和beginMap()。

void QDBusArgument::beginStructure() const

打开一个适合提取元素的 D-Bus 结构。

该函数通常用于operator>> 流操作符中,如下例所示:

const QDBusArgument &operator>>(const QDBusArgument &argument, MyStructure &myStruct)
{
    argument.beginStructure();
    argument >> myStruct.member1 >> myStruct.member2 >> myStruct.member3;
    argument.endStructure();
    return argument;
}

另请参阅 endStructure()、beginArray() 以及beginMap()。

QDBusArgument::ElementType QDBusArgument::currentType() const

返回当前元素类型的分类。如果在解析类型时发生错误,或者已到达参数末尾,则该函数返回QDBusArgument::UnknownType 。

此函数仅在反序列化参数时才有意义。如果在序列化过程中使用它,它将始终返回UnknownType 。

void QDBusArgument::endArray()

关闭通过beginArray() 打开的 D-Bus 数组。此函数的调用次数必须与beginArray() 的调用次数相同。

另请参阅 beginArray()、endStructure() 和endMap()。

void QDBusArgument::endArray() const

关闭 D-Bus 数组,并允许从数组之后提取下一个元素。

另请参阅 beginArray()。

void QDBusArgument::endMap()

关闭通过beginMap() 打开的 D-Bus 映射。此函数的调用次数必须与beginMap() 的调用次数相同。

另请参阅 beginMap()、endStructure() 和endArray()。

void QDBusArgument::endMap() const

关闭 D-Bus 映射,并允许提取映射后的下一个元素。

另请参阅 beginMap()。

void QDBusArgument::endMapEntry()

关闭通过beginMapEntry()打开的D-Bus映射条目。此函数的调用次数必须与beginMapEntry()的调用次数相同。

另请参阅 beginMapEntry()。

void QDBusArgument::endMapEntry() const

关闭 D-Bus 映射条目,并允许从映射中提取下一个元素。

另请参阅 beginMapEntry()。

void QDBusArgument::endStructure()

关闭使用beginStructure() 打开的 D-Bus 结构。此函数的调用次数必须与beginStructure() 的调用次数相同。

另请参阅 beginStructure()、endArray() 和endMap()。

void QDBusArgument::endStructure() const

关闭 D-Bus 结构,并允许提取该结构之后的下一个元素。

另请参阅 beginStructure()。

[noexcept] void QDBusArgument::swap(QDBusArgument &other)

将此参数与other 互换。此操作速度极快,且绝不会失败。

QDBusArgument &QDBusArgument::operator<<(uchar arg)

将类型为BYTE 的原始值arg 追加到D-Bus流中。

QDBusArgument &QDBusArgument::operator<<(bool arg)

将类型为BOOLEAN 的原始值arg 追加到D-Bus流中。

这是一个重载函数。

QDBusArgument &QDBusArgument::operator<<(const QByteArray &arg)

将由arg 作为ARRAY of BYTE 指定的QByteArray 追加到 D-Bus 流中。

QStringList 由于QByteArray 在Qt应用程序中被广泛使用,因此它们是QDBusArgument 直接支持的唯二两种非基本类型。

其他数组通过Qt D-Bus 中的复合类型得到支持。

这是一个重载函数。

QDBusArgument &QDBusArgument::operator<<(const QDBusVariant &arg)

将类型为VARIANT 的原始值arg 追加到D-Bus流中。

Qt D-Bus 变体类型可以包含任何类型,包括其他变体类型。它与 Qt XML 的 `QVariant ` 类型类似。

这是一个重载函数。

QDBusArgument &QDBusArgument::operator<<(const QString &arg)

将类型为STRING (Unicode字符串)的原始值arg 追加到D-Bus流中。

这是一个重载函数。

QDBusArgument &QDBusArgument::operator<<(const QStringList &arg)

将由arg 作为ARRAY of STRING 指定的QStringList 追加到 D-Bus 流中。

QStringList 由于QByteArray 在Qt应用程序中被广泛使用,因此它们是QDBusArgument 直接支持的仅有的两种非基本类型。

其他数组可通过Qt D-Bus 中的复合类型来支持。

这是一个重载函数。

QDBusArgument &QDBusArgument::operator<<(double arg)

将类型为DOUBLE (双精度浮点数)的原始值arg 追加到D-Bus流中。

这是一个重载函数。

QDBusArgument &QDBusArgument::operator<<(int arg)

将类型为INT32 的原始值arg 追加到D-Bus流中。

这是一个重载函数。

QDBusArgument &QDBusArgument::operator<<(qlonglong arg)

将类型为INT64 的原始值arg 追加到D-Bus流中。

这是一个重载函数。

QDBusArgument &QDBusArgument::operator<<(qulonglong arg)

将类型为UINT64 的原始值arg 追加到D-Bus流中。

这是一个重载函数。

QDBusArgument &QDBusArgument::operator<<(short arg)

将类型为INT16 的原始值arg 追加到D-Bus流中。

这是一个重载函数。

QDBusArgument &QDBusArgument::operator<<(uint arg)

将类型为UINT32 的原始值arg 追加到D-Bus流中。

这是一个重载函数。

QDBusArgument &QDBusArgument::operator<<(ushort arg)

将类型为UINT16 的原始值arg 追加到D-Bus流中。

这是一个重载函数。

QDBusArgument &QDBusArgument::operator=(const QDBusArgument &other)

将other QDBusArgument 对象复制到该对象中。

因此,从此刻起,这两个对象将保持相同的状态。QDBusArguments 会被显式共享,因此对其中任何一个副本所做的任何修改都会影响另一个副本。

const QDBusArgument &QDBusArgument::operator>>(uchar &arg) const

从 D-Bus 流中提取一个类型为BYTE 的 D-Bus 基本操作参数,并将其放入arg 中。

const QDBusArgument &QDBusArgument::operator>>(QByteArray &arg) const

从 D-Bus 流中提取一个字节数组,并将其作为 `QByteArray` 返回。

QStringList 由于QByteArray 在Qt应用程序中被广泛使用,因此它是QDBusArgument 直接支持的仅有的两种非基本类型之一。

其他数组可通过Qt D-Bus 中的复合类型来支持。

这是一个重载函数。

const QDBusArgument &QDBusArgument::operator>>(QDBusVariant &arg) const

从 D-Bus 流中提取一个类型为 `VARIANT ` 的 D-Bus 基本参数。

Qt D-Bus 变体类型可以包含任何类型,包括其他变体。它与 Qt XML 的 `QVariant ` 类型类似。

如果变体包含QDBusArgument 未直接支持的类型,则返回的QDBusVariant 的值将包含另一个QDBusArgument 。您需要自行将其进一步反序列化为另一种类型。

这是一个重载函数。

const QDBusArgument &QDBusArgument::operator>>(QString &arg) const

从 D-Bus 流中提取一个类型为STRING (Unicode 字符串)的 D-Bus 基本参数。

这是一个重载函数。

const QDBusArgument &QDBusArgument::operator>>(QStringList &arg) const

从 D-Bus 流中提取一个字符串数组,并将其作为 `QStringList` 返回。

QStringList 由于QByteArray 在Qt应用程序中被广泛使用,因此它是QDBusArgument 直接支持的仅有的两种非基本类型之一。

其他数组可通过Qt D-Bus 中的复合类型来支持。

这是一个重载函数。

const QDBusArgument &QDBusArgument::operator>>(bool &arg) const

从 D-Bus 流中提取一个类型为BOOLEAN 的 D-Bus 基本类型参数。

这是一个重载函数。

const QDBusArgument &QDBusArgument::operator>>(double &arg) const

从 D-Bus 流中提取一个类型为DOUBLE (双精度浮点数)的 D-Bus 基本类型参数。

这是一个重载函数。

const QDBusArgument &QDBusArgument::operator>>(int &arg) const

从 D-Bus 流中提取一个类型为INT32 的 D-Bus 基本类型参数。

这是一个重载函数。

const QDBusArgument &QDBusArgument::operator>>(qlonglong &arg) const

从 D-Bus 流中提取一个类型为INT64 的 D-Bus 基本参数。

这是一个重载函数。

const QDBusArgument &QDBusArgument::operator>>(qulonglong &arg) const

从 D-Bus 流中提取一个类型为UINT64 的 D-Bus 基本类型参数。

这是一个重载函数。

const QDBusArgument &QDBusArgument::operator>>(short &arg) const

从 D-Bus 流中提取一个类型为INT16 的 D-Bus 基本类型参数。

这是一个重载函数。

const QDBusArgument &QDBusArgument::operator>>(uint &arg) const

从 D-Bus 流中提取一个类型为 `UINT32 ` 的 D-Bus 基本类型参数。

这是一个重载函数。

const QDBusArgument &QDBusArgument::operator>>(ushort &arg) const

从 D-Bus 流中提取一个类型为UINT16 的 D-Bus 原语参数。

这是一个重载函数。

相关的非成员

template <typename T> QMetaType qDBusRegisterMetaType()

如果尚未注册,则将T 注册到Qt D-Bus 类型系统和Qt的meta-type system 中。

要注册一个类型,必须使用Q_DECLARE_METATYPE() 宏将其声明为元类型,然后按照以下示例进行注册:

#include <QDBusMetaType>

qDBusRegisterMetaType<MyClass>();

如果T 不是 Qt的容器类之一,则T 和QDBusArgument 之间的operator<< 和operator>> 流操作符必须已声明。有关如何声明此类类型的更多信息,请参阅Qt D-Bus 类型系统页面。

该函数返回该类型的 Qt 元类型标识符(与qRegisterMetaType() 返回的值相同)。

注意: 自 Qt 5.7 起,继承了可流式处理类型(包括容器QList 、QHash 或QMap )的T ,无需提供自定义的operator<< 和operator>> 即可进行流式处理的特性 已被废弃,因为该特性 会忽略T 中除基类以外的所有内容。 此处不会触发任何诊断信息。您应始终为所有需要流式传输的类型提供这些运算符,而不要依赖 Qt 为基类提供的流式传输运算符。

注意:此函数是线程安全的。

另请参阅 Qt D-Bus 类型系统、qRegisterMetaType() 以及QMetaType 。

template <typename T> T qdbus_cast(const QDBusArgument &arg)

尝试将arg 的内容反序列化为类型T 。例如:

MyType item = qdbus_cast<Type>(argument);

请注意,这等同于以下操作:

MyType item;
argument >> item;

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