QDBusPendingReply Class
QDBusPendingReply 类包含对异步方法调用的响应。更多内容...
| 头文件: | #include <QDBusPendingReply> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS DBus) target_link_libraries(mytarget PRIVATE Qt6::DBus) |
| qmake: | QT += dbus |
| 继承自: | QDBusPendingReplyBase |
公共类型
| enum { Count } |
公共函数
| QDBusPendingReply() | |
| QDBusPendingReply(const QDBusMessage &message) | |
| QDBusPendingReply(const QDBusPendingCall &call) | |
| QDBusPendingReply(const QDBusPendingReply<Types...> &other) | |
(since 6.10) | QDBusPendingReply(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() |
| operator typename Select<0>::Type() const | |
(since 6.10) int & | operator=(QDBusPendingReply<Types...> &&other) |
| QDBusPendingReply<Types...> & | operator=(const QDBusMessage &message) |
| QDBusPendingReply<Types...> & | operator=(const QDBusPendingCall &call) |
| int & | operator=(const QDBusPendingReply<Types...> &other) |
详细说明
QDBusPendingReply 是一个可变参数模板类。其模板参数是用于提取回复数据内容的类型。
该类的功能与QDBusReply 类似,但有两个重要区别:
- QDBusReply xml-ph-0000@deepl.internal 仅接受一种返回类型,而 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 。
成员类型文档
[anonymous] enum
| 常数 | 值 | 描述 |
|---|---|---|
QDBusPendingReply::Count | std::is_same_v<typename Select<0>::Type, void> ? 0 : sizeof...(Types) | 预期响应应包含的参数个数 |
成员函数文档
[default] QDBusPendingReply::QDBusPendingReply()
创建一个空的 QDBusPendingReply 对象。如果未将一个QDBusPendingCall 对象赋值给此回复对象,QDBusPendingReply 将无法执行任何操作。所有函数都会返回其失败值。
QDBusPendingReply::QDBusPendingReply(const QDBusMessage &message)
创建一个 QDBusPendingReply 对象,该对象的内容将来自消息message 。在这种情况下,该对象将处于已完成状态,且可以访问回复的内容。
另请参阅 isFinished()。
QDBusPendingReply::QDBusPendingReply(const QDBusPendingCall &call)
创建一个 QDBusPendingReply 对象,该对象将从call 的待处理异步调用中获取其内容。该 QDBusPendingReply 对象将与call 共享相同的待处理调用引用。
[implicit] QDBusPendingReply::QDBusPendingReply(const QDBusPendingReply<Types...> &other)
创建other 的QDBusPendingReply对象的副本。与QDBusPendingCall 和QDBusPendingCallWatcher 一样,该QDBusPendingReply对象将共享相同的待处理调用引用。所有副本共享相同的返回值。
[implicit, since 6.10] QDBusPendingReply::QDBusPendingReply(QDBusPendingReply<Types...> &&other)
Moves——根据other 构建一个新的QDBusPendingReply对象。
该函数于 Qt 6.10 中引入。
QVariant QDBusPendingReply::argumentAt(int index) const
返回回复内容中位于index 位置的参数。如果回复中没有这么多元素,则该函数的返回值未定义(可能会导致断言失败),因此务必验证处理是否已完成且回复是否有效。
如果响应中不包含位于位置index 的参数,或者响应本身为错误,则该函数将返回一个无效的 `QVariant`。由于 D-Bus 消息绝不会包含无效的 `QVariant`,因此可通过此返回值检测错误情况。
[constexpr] 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 事件时才会更改状态,而外部 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()。
QDBusPendingReply::operator typename Select<0>::Type() const
返回此响应中的第一个参数,并将其转换为Types[0] 类型(该类的第一个模板参数)。这相当于调用argumentAt<0>()。
提供此函数是为了方便使用,与QDBusReply::value() 函数功能一致。
请注意,如果回复尚未到达,该函数会导致调用线程阻塞,直到回复被处理完毕。
如果回复为错误回复,该函数将返回一个通过默认构造创建的Types[0] 对象,该对象可能与有效值无法区分。要可靠地确定消息是否为错误,请使用isError()。
[implicit, since 6.10] int &QDBusPendingReply::operator=(QDBusPendingReply<Types...> &&other)
该操作将other 赋值给此QDBusPendingReply 实例,并释放对当前待处理调用的引用。如果当前引用指向一个未完成的待处理调用,且这是该调用的最后一个引用,则该待处理调用将被取消,且当回复内容到达时将无法获取其内容。
该函数在 Qt 6.10 中引入。
QDBusPendingReply<Types...> &QDBusPendingReply::operator=(const QDBusMessage &message)
使该对象从message 消息中获取其内容,并释放对当前待处理调用的引用。如果当前引用指向一个未完成的待处理调用,且这是该调用的最后一个引用,则该待处理调用将被取消,且当回复内容到达时将无法检索到。
该函数执行完毕后,QDBusPendingReply 对象将处于“已完成”状态,此时可访问message 的内容。
另请参阅 isFinished()。
QDBusPendingReply<Types...> &QDBusPendingReply::operator=(const QDBusPendingCall &call)
使该对象从call 待处理调用中获取其内容,并释放对当前待处理调用的引用。如果当前引用指向一个未完成的待处理调用,且这是该调用的最后一个引用,则该待处理调用将被取消,且当回复内容到达时,将无法获取其内容。
[implicit] int &QDBusPendingReply::operator=(const QDBusPendingReply<Types...> &other)
创建other 的副本,并释放对当前待处理调用的引用。如果当前引用指向一个未完成的待处理调用,且这是该调用的最后一个引用,则该待处理调用将被取消,且当回复内容到达时将无法获取其内容。
© 2026 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.