QDBusArgument Class
QDBusArgument 类用于 marshall 和 demarshall D-Bus 参数。更多
头文件: | #include <QDBusArgument> |
CMake.QDBusArgument 类 | 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 类型系统的核心类,它提供了对原始类型进行 marshall 和 demarshall 的函数。然后,通过在数组、字典或结构中关联一个或多个原始类型来创建复合类型。
下面的示例说明了如何使用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>>
流函数在读取和写入(marshalling 和 demarshalling)时必须始终产生相同数量的条目,否则调用和信号可能会出现静默失败。
下面的示例以一个可能包含无效数据的类为例,说明了这种错误用法:
//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<键,值> 或QHash<键,值>。 |
QDBusArgument::MapEntryType | 5 | 关联容器中的一个条目:键和值构成一个映射条目类型。 |
QDBusArgument::UnknownType | -1 | 类型未知或已到列表末尾。 |
另请参阅 currentType() 。
成员函数文档
QDBusArgument::QDBusArgument()
构造一个空的 QDBusArgument 参数。
空的 QDBusArgument 对象不允许执行读或写操作。
QDBusArgument::QDBusArgument(const QDBusArgument &other)
构造other QDBusArgument 对象的副本。
因此,从这一点出发,两个对象将包含相同的状态。QDBusArguments 是明确共享的,因此对其中一个副本的任何修改都会影响另一个副本。
[noexcept]
QDBusArgument::~QDBusArgument()
处理与QDBusArgument 对象相关的资源。
QVariant QDBusArgument::asVariant() const
以QVariant 的形式返回当前参数。基本类型将在QVariant 中解码并返回,但对于复杂类型,该函数将在QVariant 中返回一个QDBusArgument 对象。调用者有责任对参数进行解码(例如,在其中调用 asVariant())。
例如,如果当前参数是 INT32,该函数将返回一个QVariant ,其参数类型为QMetaType::Int 。对于 INT32 数组,它将返回一个包含QDBusArgument 的QVariant 。
如果出现错误或没有更多参数可供解码(即参数列表已结束),该函数将返回一个无效的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 XML 的任何一个只接受一个模板参数的容器类,则无需为其声明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; }
如果您要 marshall 的类型是QList 或任何 Qt XML 的容器类(只需一个模板参数),则无需为其声明operator<<
函数,因为Qt D-Bus 提供了通用模板来完成数据 marshall 的工作。这同样适用于 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)
打开一个适合添加元素的新 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 提供了通用模板来完成数据的 marshalling 工作。
另请参见 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 。
该函数只有在对参数进行解码时才有意义。如果在 marshalling 时使用该函数,它将始终返回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 给出的QByteArray 作为ARRAY of BYTE
附加到 D-Bus 数据流中。
QStringList 和 是 直接支持的仅有的两种非原始类型,因为它们在 Qt XML 应用程序中广泛使用。QByteArray QDBusArgument
其他数组通过Qt D-Bus 中的复合类型支持。
QDBusArgument &QDBusArgument::operator<<(const QDBusVariant &arg)
这是一个重载函数。
将VARIANT
类型的基元值arg 附加到 D-Bus 数据流中。
D-Bus 变体类型可包含任何类型,包括其他变体。它类似于 Qt XMLQVariant 类型。
QDBusArgument &QDBusArgument::operator<<(const QString &arg)
这是一个重载函数。
将STRING
(Unicode 字符串)类型的基元值arg 附加到 D-Bus 数据流中。
QDBusArgument &QDBusArgument::operator<<(const QStringList &arg)
这是一个重载函数。
将arg 给出的QStringList 作为ARRAY of STRING
附加到 D-Bus 数据流中。
QStringList 和 是 直接支持的仅有的两种非原始类型,因为它们在 Qt XML 应用程序中广泛使用。QByteArray 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 和 是 直接支持的仅有的两种非原始类型,因为它们在 Qt XML 应用程序中广泛使用。QByteArray QDBusArgument
其他数组通过Qt D-Bus 中的复合类型支持。
const QDBusArgument &QDBusArgument::operator>>(QDBusVariant &arg) const
这是一个重载函数。
从 D-Bus 数据流中提取一个VARIANT
类型的 D-Bus 原始参数。
D-Bus 变体类型可包含任何类型,包括其他变体。它类似于 Qt XMLQVariant 类型。
如果变体包含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 和 是 直接支持的唯一两种非原始类型,因为它们在 Qt 应用程序中广泛使用。QByteArray 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()
在Qt D-Bus 类型系统和 Qt XMLmeta-type system 中注册T
,如果它尚未注册。
要注册一个类型,必须使用Q_DECLARE_METATYPE() 宏将其声明为元类型,然后按下面的示例注册:
#include <QDBusMetaType> qDBusRegisterMetaType<MyClass>();
如果T
不是 Qt 的容器类之一,则必须已声明T
和QDBusArgument 之间的operator<<
和operator>>
流运算符。有关如何声明此类类型的详细信息,请参阅Qt D-Bus Type System页面。
此函数返回该类型的 Qt 元类型 id(与qRegisterMetaType() 返回的值相同)。
注意: 从 Qt XML 5.7 起,继承了可流类型(包括容器QList 、QHash 或QMap )的T
无需提供自定义的operator<<
和operator>>
即可流的功能已被弃用,因为它忽略了T
中除基类之外的所有内容。没有诊断功能。您应始终为所有希望流式处理的类型提供这些操作符,而不是依赖 Qt 为基类提供的流式处理操作符。
注意:该函数是线程安全的。
另请参阅 Qt D-Bus Type System、qRegisterMetaType() 和QMetaType 。
template <typename T> T qdbus_cast(const QDBusArgument &arg)
尝试将arg 的内容解散到T
类型中。例如
MyType item = qdbus_cast<Type>(argument);
请注意,它等同于以下内容:
MyType item; argument >> item;
© 2025 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.