QDBusPendingReply Class

template <typename... Types> class QDBusPendingReply

QDBusPendingReply 类包含对异步方法调用的回复。更多

头文件: #include <QDBusPendingReply>
CMake: find_package(Qt6 REQUIRED COMPONENTS DBus)
target_link_libraries(mytarget PRIVATE Qt6::DBus)
qmake: QT += dbus
继承于QDBusPendingReplyBase

公共类型

enum anonymous { Count }

公共函数

QDBusPendingReply()
QDBusPendingReply(const QDBusMessage &message)
QDBusPendingReply(const QDBusPendingCall &call)
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 QDBusMessage &message)
QDBusPendingReply<Types...> &operator=(const QDBusPendingCall &call)
QDBusPendingReply<Types...> &operator=(const QDBusPendingReply<Types...> &other)

详细说明

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 对象关联,当回复到达时,这些对象会发出信号。

另请参阅 QDBusPendingCallWatcherQDBusReply

成员类型文档

enum QDBusPendingReply::anonymous

常数说明
QDBusPendingReply::Countstd::is_same_v<typename Select<0>::Type, void> ? 0 : sizeof...(Types)回复预计会有的参数数

成员函数文档

QDBusPendingReply::QDBusPendingReply()

创建一个空的 QDBusPendingReply 对象。如果不为该回复分配QDBusPendingCall 对象,QDBusPendingReply 将无法执行任何操作。所有函数都会返回失败值。

QDBusPendingReply::QDBusPendingReply(const QDBusMessage &message)

创建一个 QDBusPendingReply 对象,其内容来自消息message 。在这种情况下,该对象将已处于完成状态,回复的内容将可供访问。

另请参阅 isFinished().

QDBusPendingReply::QDBusPendingReply(const QDBusPendingCall &call)

创建一个 QDBusPendingReply 对象,其内容来自call 挂起的异步调用。该 QDBusPendingReply 对象将与call 共享相同的挂起调用引用。

QDBusPendingReply::QDBusPendingReply(const QDBusPendingReply<Types...> &other)

创建other QDBusPendingReply 对象的副本。与QDBusPendingCallQDBusPendingCallWatcher 一样,该 QDBusPendingReply 对象将共享相同的挂起调用引用。所有副本都共享相同的返回值。

QVariant QDBusPendingReply::argumentAt(int index) const

返回回复内容中位于index 位置的参数。如果回复没有那么多元素,该函数的返回值将是未定义的(很可能导致断言失败),因此必须验证处理是否已完成以及回复是否有效。

如果回复不包含位于index 位置的参数,或者回复是一个错误,则该函数返回一个无效的QVariant 。由于 D-Bus 报文永远不会包含无效的 QVariants,因此该返回值可用于检测错误条件。

[constexpr] int QDBusPendingReply::count() const

返回 reply 应该有的参数个数。该参数数与该类中的非空模板参数数一致。

如果回复的参数数不同(或类型不同),它将被转换为错误回复,表示签名错误。

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 类型的QDBusMessage::InvalidMessage

处理完成后,消息类型要么是错误消息,要么是正常的方法回复消息。

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 QDBusMessage &message)

使该对象从message 消息中获取内容,并删除对当前待处理调用的引用。如果当前引用指向的是一个未完成的挂起调用,而这是最后一次引用,则挂起调用将被取消,当回复内容到达时将无法检索。

此函数完成后,QDBusPendingReply 对象将处于 "完成 "状态,并且可以访问message 的内容。

另请参见 isFinished().

QDBusPendingReply<Types...> &QDBusPendingReply::operator=(const QDBusPendingCall &call)

使该对象从call 待处理调用中获取内容,并删除对当前待处理调用的引用。如果当前引用指向的是一个未完成的待处理调用,而这是最后一次引用,则待处理调用将被取消,当回复内容到达时将无法检索。

QDBusPendingReply<Types...> &QDBusPendingReply::operator=(const QDBusPendingReply<Types...> &other)

创建other 的副本,并删除对当前待处理调用的引用。如果当前引用指向的是一个未完成的待处理调用,而这是最后一次引用,那么待处理调用将被取消,当回复内容到达时将无法检索。

© 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.