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公司有限公司的商标。所有其他商标均为各自所有者的财产。