QDBusPendingReply 类
template <typename... Types> class QDBusPendingReplyQDBusPendingReply 类包含异步方法调用的响应。 更多...
头文件 | #include <QDBusPendingReply> |
CMake | find_package(Qt6 REQUIRED COMPONENTS DBus) target_link_libraries(mytarget PRIVATE Qt6::DBus) |
qmake | QT += dbus |
继承自 | QDBusPendingReplyBase |
公共类型
枚举 | 匿名枚举 { Count } |
公共函数
QDBusPendingReply() | |
QDBusPendingReply(const QDBusPendingCall &call) | |
QDBusPendingReply(const QDBusMessage &message) | |
QDBusPendingReply(const QDBusPendingReply<Types...> &other) | |
QVariant | argumentAt(int index) const |
int | count() const |
QDBusError | error() const |
bool | isError() const |
bool | isFinished() const |
bool | isValid() const |
QDBusMessage | reply() const |
typename Select<0>::Type | value() const |
void | waitForFinished() |
typename Select<0>::Type | operator typename Select<0>::Type() const |
QDBusPendingReply<Types...> & | operator=(const QDBusPendingReply<Types...> &other) |
QDBusPendingReply<Types...> & | operator=(const QDBusPendingCall &call) |
QDBusPendingReply<Types...> & | operator=(const QDBusMessage &message) |
详细描述
QDBusPendingReply 是一个变元模板类。模板参数是用于提取响应数据内容的类型。
这个类在功能上类似于 QDBusReply,但有两大重要区别
- QDBusReply 只接受一个返回类型,而 QDBusPendingReply 可以有任意数量的类型
- QDBusReply 只在已完成的回复上工作,而 QDBusPendingReply 允许等待挂起的调用的回复
在 QDBusReply 中你会写
QDBusReply<QString> reply = interface->call("RemoteMethod"); if (reply.isValid()) // use the returned value useValue(reply.value()); else // call failed. Show an error condition. showError(reply.error());
使用 QDBusPendingReply,相应的代码(包括阻塞等待回复)将是
QDBusPendingReply<QString> reply = iface->asyncCall("RemoteMethod"); reply.waitForFinished(); if (reply.isError()) // call failed. Show an error condition. showErrorD(reply.error()); else // use the returned value useValue(reply.value());
对于具有多个输出参数的方法调用,使用 QDBusReply,你将编写
reply = interface->call("RemoteMethod");
而使用 QDBusPendingReply,所有的输出参数都应该是模板参数
QDBusPendingReply<bool, QString> reply = iface->asyncCall("RemoteMethod"); reply.waitForFinished(); if (!reply.isError()) { if (reply.argumentAt<0>()) showSuccess(reply.argumentAt<1>()); else showFailure(reply.argumentAt<1>()); }
QDBusPendingReply 对象可以关联到 QDBusPendingCallWatcher 对象,它们在回复到达时发出信号。
另请参阅 QDBusPendingCallWatcher 和 QDBusReply。
成员类型文档
enum QDBusPendingReply::匿名
常量 | 值 | 描述 |
---|---|---|
QDBusPendingReply::Count | std::is_same_v<typename Select<0>::Type, void> ? 0 : sizeof...(Types) | 回复期望具有的参数数量 |
成员函数文档
QDBusPendingReply::QDBusPendingReply()
创建一个空的 QDBusPendingReply 对象。除非将一个 QDBusPendingCall 对象分配给此回复,否则 QDBusPendingReply 无法执行任何操作。所有函数都返回其失败值。
QDBusPendingReply::QDBusPendingReply(const QDBusPendingCall &调用)
创建一个 QDBusPendingReply 对象,它将从 调用 挂起异步调用中获取其内容。此 QDBusPendingReply 对象将与 调用 共享相同的挂起调用引用。
QDBusPendingReply::QDBusPendingReply(const QDBusMessage &信息)
创建一个 QDBusPendingReply 对象,它将从消息 信息 中获取其内容。在这种情况下,此对象已经处于完成状态,并且可以访问回复的内容。
另请参阅 isFinished。
QDBusPendingReply::QDBusPendingReply(const QDBusPendingReply<Types...> &其他)
创建 其他 QDBusPendingReply 对象的副本。就像 QDBusPendingCall 和 QDBusPendingCallWatcher 一样,此 QDBusPendingReply 对象将与 调用 共享相同的挂起调用引用。所有副本共享相同的返回值。
QVariant QDBusPendingReply::argumentAt(int 索引) const
返回回复内容中位置为 索引 的参数。如果回复没有那么多元素,此函数的返回值是未定义的(可能引起断言失败),因此验证处理已完成且回复有效非常重要。
如果回复在位置 索引 处不包含参数或如果回复是错误,此函数返回一个无效的 QVariant。由于 D-Bus 消息永远不会包含无效的 QVariants,因此可以使用此返回值来检测错误条件。
[常量表达式]
int QDBusPendingReply::count() const
返回回复应该具有的参数数量。此数字与此类中非 void 模板参数的数量相匹配。
如果回复带有不同数量的参数(或不同类型),它将被转换为指示错误签名的错误回复。
QDBusError QDBusPendingReply::error() const
获取响应消息中的错误内容,如果已完成处理。如果响应消息尚未完成处理或包含正常响应消息(非错误),则此函数返回无效的QDBusError。
bool QDBusPendingReply::isError() const
如果响应包含错误消息则返回true
,如果包含正常方法响应则返回false。
如果挂起的调用尚未完成处理,此函数也会返回true
。
bool QDBusPendingReply::isFinished() const
如果挂起的调用已完成处理并已收到响应,则返回true
。如果此函数返回true
,则isError()、error()和reply()方法应返回有效信息。
请注意,只有在你调用waitForFinished()或发生外部D-Bus事件时,此函数才会更改状态,通常只有在返回到事件循环执行时才会。
另请参阅QDBusPendingCallWatcher::isFinished。
bool QDBusPendingReply::isValid() const
如果响应包含正常响应消息则返回true
,如果包含其他任何内容则返回false。
如果挂起的调用尚未完成处理,此函数返回false。
QDBusMessage QDBusPendingReply::reply() const
如果异步调用已完成处理,则检索接收到的响应消息。如果挂起的调用未完成,此函数返回一个类型为QDBusMessage::InvalidMessage的QDBusMessage。
处理后,消息类型将是错误消息或正常方法响应消息之一。
typename Select<0>::Type QDBusPendingReply::value() const
返回此响应的第一个参数,转换为Types[0]
(此类的第一个模板参数)。这等同于调用argumentAt<0>()。
此函数提供方便,与QDBusReply::value()函数相匹配。
请注意,如果响应尚未到达,此函数将使调用线程阻塞,直到处理响应。
如果响应是错误响应,则此函数返回一个默认构造的Types[0]
对象,这可能与有效值区分不开。为了可靠地确定消息是否为错误,请使用isError()。
void QDBusPendingReply::waitForFinished
挂起调用线程的执行,直到收到并处理响应。在此函数返回后,isFinished()应返回true,表示响应的内容已准备好处理。
另请参阅QDBusPendingCallWatcher::waitForFinished。
typename Select<0>::Type QDBusPendingReply::operator typename Select<0>::Type() const
返回此响应的第一个参数,转换为Types[0]
(此类的第一个模板参数)。这等同于调用argumentAt<0>()。
此函数提供方便,与QDBusReply::value()函数相匹配。
请注意,如果响应尚未到达,此函数将使调用线程阻塞,直到处理响应。
如果响应是错误响应,则此函数返回一个默认构造的Types[0]
对象,这可能与有效值区分不开。为了可靠地确定消息是否为错误,请使用isError()。
QDBusPendingReply<Types...> &QDBusPendingReply::operator=(const QDBusPendingReply<Types...> &other)
复制other的内容并放弃对当前挂起的调用的引用。如果当前引用针对的是未完成的挂起调用,并且这是最后一个引用,当回复到达时,将无法检索回复的内容。
QDBusPendingReply<Types...> &QDBusPendingReply::operator=(const QDBusPendingCall &call)
使此对象从挂起的调用call中获取其内容并放弃对当前挂起调用的引用。如果当前引用针对的是未完成的挂起调用,并且这是最后一个引用,挂起的调用将被取消,将无法在回复到达时检索其内容。
QDBusPendingReply<Types...> &QDBusPendingReply::operator=(const QDBusMessage &message)
使此对象从message消息中获取其内容并放弃对当前挂起调用的引用。如果当前引用针对的是未完成的挂起调用,并且这是最后一个引用,挂起的调用将被取消,将无法在回复到达时检索其内容。
在此函数执行完毕后,QDBusPendingReply对象将处于“已完成”状态,并且可访问message的内容。
另请参阅 isFinished。
© 2024 The Qt Company Ltd. 本文档中包含的贡献属于各自的版权所有者。本提供的文档是根据免费软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款进行许可的。Qt 和相应的徽标是 The Qt Company Ltd. 在芬兰及其他全球国家的注册商标。其他所有商标均为其各自所有者的财产。