QDBusArgument 类

QDBusArgument 类用于打包和解包 D-Bus 参数。 更多...

头文件 #include <QDBusArgument>
CMakefind_package(Qt6 REQUIRED COMPONENTS DBus)
target_link_libraries(mytarget PRIVATE Qt6::DBus)
qmakeQT += dbus

公共类型

枚举ElementType { 基本类型,变体类型,数组类型,结构体类型,映射类型,…,未知类型 }

公共函数

QDBusArgument()
QDBusArgument(const QDBusArgument &other)
~QDBusArgument()
QVariantasVariant() const
boolatEnd() const
voidbeginArray(QMetaType id)
voidbeginArray() const
voidbeginMap(QMetaType keyMetaType, QMetaType valueMetaType)
voidbeginMap() const
voidbeginMapEntry()
voidbeginMapEntry() const
voidbeginStructure()
voidbeginStructure() const
QDBusArgument::ElementTypecurrentType() const
voidendArray()
voidendArray() const
voidendMap()
voidendMap() const
voidendMapEntry()
voidendMapEntry() const
voidendStructure()
voidendStructure() const
voidswap(QDBusArgument &other)
QDBusArgument &operator<<(uchar arg)
QDBusArgument &operator<<(bool arg)
QDBusArgument &operator<<(short arg)
QDBusArgument &operator<<(ushort arg)
QDBusArgument &operator<<(int arg)
QDBusArgument &operator<<(uint arg)
QDBusArgument &operator<<(qlonglong arg)
QDBusArgument &operator<<(qulonglong arg)
QDBusArgument &operator<<(double arg)
QDBusArgument &operator<<(const QString &arg)
QDBusArgument &operator<<(const QDBusVariant &arg)
QDBusArgument &operator<<(const QStringList &arg)
QDBusArgument &operator<<(const QByteArray &arg)
QDBusArgument &operator=(const QDBusArgument &other)
const QDBusArgument &operator>>(uchar &arg) const
const QDBusArgument &operator>>(bool &arg) const
const QDBusArgument &operator>>(short &arg) const
const QDBusArgument &operator>>(ushort &arg) const
const QDBusArgument &operator>>(int &arg) const
const QDBusArgument &operator>>(uint &arg) const
const QDBusArgument &operator>>(qlonglong &arg) const
const QDBusArgument &operator-gt-gt-7" translate="no">operator>>(qulonglong &arg) const
const QDBusArgument &operator>>(double &arg) const
const QDBusArgument &operator>>(QString &arg) const
const QDBusArgument &operator>>(QDBusVariant &arg) const
const QDBusArgument &operator>>(QStringList &arg) const
const QDBusArgument &operator>>(QByteArray &arg) const
QMetaTypeqDBusRegisterMetaType()
Tqdbus_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>();

一旦注册,类型就可以在 outgoing 方法调用(与 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 类型系统混淆,应避免。

另请参阅QDBusAbstractInterfaceQt D-Bus 类型系统使用适配器qdbus_cast

成员类型文档

enum QDBusArgument::ElementType

此枚举描述了由参数持有的元素的类型。

常量描述
QDBusArgument::BasicType0一个基本元素,由 QVariant 所理解。以下类型被认为是基本的:bool、byte、short、ushort、int、uint、qint64、quint64、double、QStringQByteArrayQDBusObjectPathQDBusSignature
QDBusArgument::VariantType1变体元素(QDBusVariant
QDBusArgument::ArrayType2一个数组元素,通常由 QList<T> 表示。注意:QByteArray 和关联映射不被认为是数组,即使 D-Bus 协议将其作为此类传输。
QDBusArgument::StructureType3由结构体表示的自定义类型,例如 QDateTimeQPoint 等。
QDBusArgument::MapType4一个关联容器,例如 QMap<Key, Value> 或 QHash<Key, Value>
QDBusArgument::MapEntryType5关联容器中的一个条目:键和值都形成一种地图条目类型。
QDBusArgument::UnknownType-1类型未知或已到达列表末尾。

另请参阅 currentType

成员函数文档

QDBusArgument::QDBusArgument()

构造一个空的 QDBusArgument 参数。

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

QDBusArgument::QDBusArgument(const QDBusArgument &other)

构造 iother QDBusArgument 对象的副本。

因此,从这一点开始,这两个对象将包含相同的状态。QDBusArguments 是显式共享的,因此对任何一个副本的任何修改都将影响另一个副本。

[noexcept] QDBusArgument::~QDBusArgument()

处理与此 QDBusArgument 对象相关联的资源。

QVariant QDBusArgument::asVariant() const

QVariant 的形式返回当前参数。基本类型将解码并返回在 QVariant 中,但对于复杂类型,此函数将返回 QDBusArgument 对象在 QVariant 中。调用者负责解码参数(例如,通过在其中调用 asVariant())。

例如,如果当前参数是 INT32,则此函数将返回一个带有类型为 QMetaType::IntQVariant。对于 INT32 数组,它将返回一个包含 QDBusArgumentQVariant

如果发生错误或没有更多参数可以解码(即,我们已到达参数列表末尾),则此函数将返回一个无效的 QVariant

另请参阅 atEnd

bool QDBusArgument::atEnd() const

如果从这个 QDBusArgument 中没有更多的元素可以提取,则返回 true。此函数通常用于从 beginMap() 和 beginArray() 返回的 QDBusArgument 对象。

void QDBusArgument::beginArray(QMetaType id)

为添加元类型 id 的元素打开一个新的 D-Bus 数组。

此函数通常用于 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 或任何只有一个模板参数的 Qt 容器类,则不需要为此声明 operator<< 函数,因为 Qt D-Bus 提供了通用的模板来完成数据序列化的任务。这同样适用于 STL 的序列容器,如 std::liststd::vector 等。

参见endArray()、beginStructure() 和 beginMap()。

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::liststd::vector 等。

参见atEnd()、beginStructure() 和 beginMap()。

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

打开一个新的 D-Bus 映射,用于添加元素。映射是将一个条目(键)与另一个条目(值)关联的容器,如 Qt 的 QMapQHash。映射键和值元类型的 ID 必须分别通过 keyMetaTypevalueMetaType 传入。

此函数通常用于 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::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;
}

如果您需要反序列化的类型是 QMapQHash,则不需要声明 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 &QDBusArgument::operator<<(uchar arg)

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

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

这是一个重载函数。

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

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

这是一个重载函数。

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

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

这是一个重载函数。

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

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

这是一个重载函数。

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

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

这是一个重载函数。

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

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

这是一个重载函数。

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

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

这是一个重载函数。

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

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

这是一个重载函数。

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

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

这是一个重载函数。

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

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

这是一个重载函数。

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

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

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

这是一个重载函数。

arg 给定的 QStringList 作为 STRING 的数组添加到 D-Bus 流中。

QStringListQByteArray 是唯一两种 QDBusArgument 直接支持的非原始类型,因为在 Qt 应用中对它们的广泛使用。

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

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

这是一个重载函数。

arg 给定的 QByteArray 作为 BYTE 的数组添加到 D-Bus 流中。

QStringListQByteArray 是唯一两种 QDBusArgument 直接支持的非原始类型,因为在 Qt 应用中对它们的广泛使用。

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

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

otherQDBusArgument 对象复制到此。

因此,从这一点开始,这两个对象将包含相同的状态。QDBusArguments 是显式共享的,因此对任何一个副本的任何修改都将影响另一个副本。

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

从 D-Bus 流中提取一个类型为 BYTE 的 D-Bus 原始参数并将其放入 arg 中。

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

这是一个重载函数。

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

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

这是一个重载函数。

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

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

这是一个重载函数。

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

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

这是一个重载函数。

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

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

这是一个重载函数。

从 D-Bus 流中提取类型为 UINT32 的一个 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>>(double &arg) const

这是一个重载函数。

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

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

这是一个重载函数。

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

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

这是一个重载函数。

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

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

如果元数据包含 QDBusArgument 不直接支持的类型,返回的 QDBusVariant 的值将包含另一个 QDBusArgument。您有责任将其进一步反序列化为另一种类型。

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

这是一个重载函数。

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

QStringListQByteArray 是唯一两种 QDBusArgument 直接支持的非原始类型,因为在 Qt 应用中对它们的广泛使用。

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

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

这是一个重载函数。

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

QStringListQByteArray 是唯一两种 QDBusArgument 直接支持的非原始类型,因为在 Qt 应用中对它们的广泛使用。

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

相关非成员

template <typename T> QMetaType qDBusRegisterMetaType()

如果还未注册,则使用Qt D-Bus类型系统( Qt D-Bus类型系统 )和Qt的元类型系统注册 T 寄存器。

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

#include <QDBusMetaType>

qDBusRegisterMetaType<MyClass>();

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

此函数返回该类型的Qt元类型ID(与qRegisterMetaType() 返回的相同值)。

注意:由于它忽略了除基类之外的所有 T 内容,因此从Qt 5.7开始,一个继承自可流式传输的类型(包括容器QListQHashQMap)的 T 可以在不提供自定义 operator<<operator>> 的情况下进行流式传输的功能已被弃用。没有任何诊断信息。您应该始终为所有希望流式传输的类型提供这些操作符,并且不要依赖于Qt提供的base类流操作符。

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

另请参阅:Qt D-Bus类型系统qRegisterMetaType() 和 QMetaType

模板 <typename T> T qdbus_cast(const QDBusArgument &arg)

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

MyType item = qdbus_cast<Type>(argument);

请注意,它与以下内容相同

MyType item;
argument >> item;

© 2024 Qt公司有限公司。包含在此处的文档贡献是各自所有者的版权。提供的文档受GNU自由文档许可版1.3的条款控制,该许可是由自由软件基金会发布的。Qt及其标志是芬兰和/或世界上其他国家的Qt公司有限公司的商标。所有其他商标均为各自所有者的财产。