QDBusArgument 类
QDBusArgument 类用于打包和解包 D-Bus 参数。 更多...
| 头文件 | #include <QDBusArgument> | 
| CMake | find_package(Qt6 REQUIRED COMPONENTS DBus) target_link_libraries(mytarget PRIVATE Qt6::DBus) | 
| qmake | QT += dbus | 
公共类型
| 枚举 | ElementType { 基本类型,变体类型,数组类型,结构体类型,映射类型,…,未知类型 } | 
公共函数
| QDBusArgument() | |
| QDBusArgument(const QDBusArgument &other) | |
| ~QDBusArgument() | |
| QVariant | asVariant() const | 
| bool | atEnd() const | 
| void | beginArray(QMetaType id) | 
| void | beginArray() const | 
| void | beginMap(QMetaType keyMetaType, QMetaType valueMetaType) | 
| void | beginMap() const | 
| 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<<(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 | 
相关非成员
| 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>();
一旦注册,类型就可以在 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 类型系统混淆,应避免。
另请参阅QDBusAbstractInterface,Qt D-Bus 类型系统,使用适配器和qdbus_cast。
成员类型文档
enum QDBusArgument::ElementType
此枚举描述了由参数持有的元素的类型。
| 常量 | 值 | 描述 | 
|---|---|---|
| QDBusArgument::BasicType | 0 | 一个基本元素,由 QVariant 所理解。以下类型被认为是基本的:bool、byte、short、ushort、int、uint、qint64、quint64、double、QString、QByteArray、QDBusObjectPath、QDBusSignature | 
| QDBusArgument::VariantType | 1 | 变体元素(QDBusVariant) | 
| QDBusArgument::ArrayType | 2 | 一个数组元素,通常由 QList<T> 表示。注意:QByteArray 和关联映射不被认为是数组,即使 D-Bus 协议将其作为此类传输。 | 
| QDBusArgument::StructureType | 3 | 由结构体表示的自定义类型,例如 QDateTime、QPoint 等。 | 
| QDBusArgument::MapType | 4 | 一个关联容器,例如 QMap<Key, Value> 或 QHash<Key, Value> | 
| QDBusArgument::MapEntryType | 5 | 关联容器中的一个条目:键和值都形成一种地图条目类型。 | 
| 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::Int 的 QVariant。对于 INT32 数组,它将返回一个包含 QDBusArgument 的 QVariant。
如果发生错误或没有更多参数可以解码(即,我们已到达参数列表末尾),则此函数将返回一个无效的 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::list、std::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::list、std::vector 等。
参见atEnd()、beginStructure() 和 beginMap()。
void QDBusArgument::beginMap(QMetaType keyMetaType, QMetaType valueMetaType)
打开一个新的 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::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::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 流中。
QStringList 和 QByteArray 是唯一两种 QDBusArgument 直接支持的非原始类型,因为在 Qt 应用中对它们的广泛使用。
其他数组通过 Qt D-Bus 中的复合类型得到支持。
QDBusArgument &QDBusArgument::operator<<(const QByteArray &arg)
这是一个重载函数。
将 arg 给定的 QByteArray 作为 BYTE 的数组添加到 D-Bus 流中。
QStringList 和 QByteArray 是唯一两种 QDBusArgument 直接支持的非原始类型,因为在 Qt 应用中对它们的广泛使用。
其他数组通过 Qt 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>>(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 返回。
QStringList 和 QByteArray 是唯一两种 QDBusArgument 直接支持的非原始类型,因为在 Qt 应用中对它们的广泛使用。
其他数组通过 Qt D-Bus 中的复合类型得到支持。
const QDBusArgument &QDBusArgument::operator>>(QByteArray &arg) const
这是一个重载函数。
从 D-Bus 流中提取字节数组,并作为 QByteArray 返回。
QStringList 和 QByteArray 是唯一两种 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的容器类之一,则必须在 T 和 QDBusArgument 之间声明 operator<< 和 operator>> 流操作符。有关如何声明此类类型的信息,请参阅Qt D-Bus类型系统页面。
此函数返回该类型的Qt元类型ID(与qRegisterMetaType() 返回的相同值)。
注意:由于它忽略了除基类之外的所有 T 内容,因此从Qt 5.7开始,一个继承自可流式传输的类型(包括容器QList、QHash 或 QMap)的 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公司有限公司的商标。所有其他商标均为各自所有者的财产。