QDBusPendingReply 类

template <typename... Types> class QDBusPendingReply

QDBusPendingReply 类包含异步方法调用的响应。 更多...

头文件 #include <QDBusPendingReply>
CMakefind_package(Qt6 REQUIRED COMPONENTS DBus)
target_link_libraries(mytarget PRIVATE Qt6::DBus)
qmakeQT += dbus
继承自QDBusPendingReplyBase

公共类型

枚举匿名枚举 { Count }

公共函数

QDBusPendingReply()
QDBusPendingReply(const QDBusPendingCall &call)
QDBusPendingReply(const QDBusMessage &message)
QDBusPendingReply(const QDBusPendingReply<Types...> &other)
QVariantargumentAt(int index) const
intcount() const
QDBusErrorerror() const
boolisError() const
boolisFinished() const
boolisValid() const
QDBusMessagereply() const
typename Select<0>::Typevalue() const
voidwaitForFinished()
typename Select<0>::Typeoperator 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 对象,它们在回复到达时发出信号。

另请参阅 QDBusPendingCallWatcherQDBusReply

成员类型文档

enum QDBusPendingReply::匿名

常量描述
QDBusPendingReply::Countstd::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 对象的副本。就像 QDBusPendingCallQDBusPendingCallWatcher 一样,此 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::InvalidMessageQDBusMessage

处理后,消息类型将是错误消息或正常方法响应消息之一。

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. 在芬兰及其他全球国家的注册商标。其他所有商标均为其各自所有者的财产。