QDBusAbstractInterface Class

QDBusAbstractInterface 类是Qt D-Bus 绑定中所有 D-Bus 接口的基类,允许访问远程接口。更多

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

QDBusConnectionInterfaceQDBusInterface

公共函数

virtual ~QDBusAbstractInterface()
QDBusPendingCall asyncCall(const QString &method, Args &&... args)
QDBusPendingCall asyncCallWithArgumentList(const QString &method, const QList<QVariant> &args)
QDBusMessage call(const QString &method, Args &&... args)
QDBusMessage call(QDBus::CallMode mode, const QString &method, Args &&... args)
QDBusMessage callWithArgumentList(QDBus::CallMode mode, const QString &method, const QList<QVariant> &args)
bool callWithCallback(const QString &method, const QList<QVariant> &args, QObject *receiver, const char *returnMethod, const char *errorMethod)
bool callWithCallback(const QString &method, const QList<QVariant> &args, QObject *receiver, const char *slot)
QDBusConnection connection() const
QString interface() const
(since 6.7) bool isInteractiveAuthorizationAllowed() const
bool isValid() const
QDBusError lastError() const
QString path() const
QString service() const
(since 6.7) void setInteractiveAuthorizationAllowed(bool enable)
void setTimeout(int timeout)
int timeout() const

详细说明

生成代码类也派生自 QDBusAbstractInterface,此处描述的所有方法对生成代码类同样有效。除了这里描述的方法外,生成代码类还为远程方法提供了成员函数,这些函数允许在编译时检查参数和返回值是否正确,以及属性类型匹配和信号参数匹配。

另请参阅 QDBus 编译器QDBusInterface

成员函数文档

[virtual noexcept] QDBusAbstractInterface::~QDBusAbstractInterface()

释放该对象的资源。

template <typename... Args> QDBusPendingCall QDBusAbstractInterface::asyncCall(const QString &method, Args &&... args)

调用该接口上的方法method ,并将args 传递给该方法。所有args 都必须转换为QVariant

call 的参数作为输入参数通过 D-Bus 传递给远程函数。返回的QDBusPendingCall 对象可用于查找有关回复的信息。

使用方法如下:

QDBusPendingCall pcall = interface->asyncCall("GetAPIVersion"_L1);
auto watcher = new QDBusPendingCallWatcher(pcall, this);

QObject::connect(watcher, &QDBusPendingCallWatcher::finished, this,
                 [&](QDBusPendingCallWatcher *w) {
    QString value = retrieveValue();
    QDBusPendingReply<int> reply(*w);
    QDBusPendingCall pcall;
    if (reply.argumentAt<0>() >= 14)
        pcall = interface->asyncCall("ProcessWorkUnicode"_L1, value);
    else
        pcall = interface->asyncCall("ProcessWork"_L1, "UTF-8"_L1, value.toUtf8());

    w = new QDBusPendingCallWatcher(pcall);
    QObject::connect(w,  &QDBusPendingCallWatcher::finished, this,
                     &Abstract_DBus_Interface::callFinishedSlot);
});

该示例说明了使用 0、1 和 2 个参数调用函数的情况,并说明了每个参数传递的不同参数类型(对"ProcessWorkUnicode" 的第一次调用将包含一个 Unicode 字符串,对"ProcessWork" 的第二次调用将包含一个字符串和一个字节数组)。阻塞(同步)调用中的相同示例请参见call()。

注: 在 Qt 5.14 之前,该函数最多只能接受八 (8) 个参数。

注: 由于实现上的限制,对本地QDBusServer 的方法调用从来都不是异步的。

另请参阅 asyncCallWithArgumentList()。

QDBusPendingCall QDBusAbstractInterface::asyncCallWithArgumentList(const QString &method, const QList<QVariant> &args)

使用args 作为参数,在此接口上调用method 指定的远程方法。该函数返回一个QDBusPendingCall 对象,用于跟踪回复的状态,并在回复到达后访问其内容。

通常,应使用asyncCall() 进行调用。

注: 由于实现上的限制,对应用程序本身注册的对象的方法调用永远不会是异步的。

注意:此函数是线程安全的

template <typename... Args> QDBusMessage QDBusAbstractInterface::call(const QString &method, Args &&... args)

调用该接口上的方法method ,并将args 传递给该方法。所有args 都必须转换为QVariant

call 的参数作为输入参数通过 D-Bus 传递给远程函数。输出参数在QDBusMessage 的回复中返回。如果回复是错误回复,lastError() 也将被设置为错误信息的内容。

使用方法如下:

QString value = retrieveValue();
QDBusMessage reply;

QDBusReply<int> api = interface->call("GetAPIVersion"_L1);
if (api >= 14)
  reply = interface->call("ProcessWorkUnicode"_L1, value);
else
  reply = interface->call("ProcessWork"_L1, "UTF-8"_L1, value.toUtf8());

此示例说明了使用 0、1 和 2 个参数调用函数的情况,并说明了在每个参数中传递的不同参数类型(对"ProcessWorkUnicode" 的第一次调用将包含一个 Unicode 字符串,对"ProcessWork" 的第二次调用将包含一个字符串和一个字节数组)。请参见asyncCall() 以了解非阻塞(异步)调用中的相同示例。

注: 在 Qt 5.14 之前,该函数最多只能接受八 (8) 个参数。

另请参见 callWithArgumentList()。

template <typename... Args> QDBusMessage QDBusAbstractInterface::call(QDBus::CallMode mode, const QString &method, Args &&... args)

这是一个重载函数。

调用该接口上的方法method ,并将args 传递给该方法。所有args 都必须转换为QVariant

如果modeNoWaitForReply ,那么此函数将在发出调用后立即返回,而无需等待远程方法的回复。否则,mode 表示此函数在等待回复到达时是否应激活 Qt Event Loop。

如果该函数为了等待回复而重新进入 Qt 事件循环,它将排除用户输入。在等待期间,它可能会向您的应用程序发送信号和其他方法调用。因此,无论何时使用 call() 调用,它都必须做好处理重入的准备。

注意: 在 Qt 5.14 之前,该函数最多只能接受八 (8) 个参数。

另请参阅 callWithArgumentList()。

QDBusMessage QDBusAbstractInterface::callWithArgumentList(QDBus::CallMode mode, const QString &method, const QList<QVariant> &args)

使用args 作为参数,在此接口上调用method 指定的远程方法。该函数返回收到的回复信息,可以是正常的QDBusMessage::ReplyMessage (表示成功)或QDBusMessage::ErrorMessage (如果调用失败)。mode 参数指定了调用的方式。

如果调用成功,lastError() 将被清空;否则,它将包含调用产生的错误信息。

通常情况下,应使用call() 进行调用。

警告: 如果您使用UseEventLoop ,您的代码必须准备好处理任何重入问题:其他方法调用和信号可能会在此函数返回前传递,以及其他 Qt XML 队列信号和事件。

注意:此函数是线程安全的

bool QDBusAbstractInterface::callWithCallback(const QString &method, const QList<QVariant> &args, QObject *receiver, const char *returnMethod, const char *errorMethod)

使用args 作为参数,在此接口上调用method 指定的远程方法。该函数在队列调用后立即返回。远程函数的回复将传递给对象receiver 上的returnMethod 。如果出现错误,将调用对象receiver 上的errorMethod 代替。

如果排队成功,该函数将返回true 。它并不表示执行的调用成功。如果失败,则调用errorMethod 。如果排队失败,该函数将返回false ,并且不会调用槽。

returnMethod 的参数必须是函数调用返回的类型。可选择将QDBusMessage 作为最后一个或唯一的参数。errorMethod 的唯一参数必须是QDBusError

注: 由于实现上的限制,对应用程序本身注册的对象的方法调用永远不会是异步的。

另请参阅 QDBusErrorQDBusMessage

bool QDBusAbstractInterface::callWithCallback(const QString &method, const QList<QVariant> &args, QObject *receiver, const char *slot)

这是一个重载函数。

该函数已被弃用。请使用重载版本。

使用args 作为参数,在此接口上调用method 指定的远程方法。该函数在队列调用后立即返回。远程函数的回复或任何错误都会传送到对象receiver 上的slot 插槽。

如果排队成功,该函数将返回true :它并不表示调用成功。如果调用失败,该槽将被调用并显示错误信息。lastError(在这种情况下,将不会设置()。

另请参见 QDBusErrorQDBusMessage

QDBusConnection QDBusAbstractInterface::connection() const

返回此接口关联的连接。

QString QDBusAbstractInterface::interface() const

返回此接口的名称。

[since 6.7] bool QDBusAbstractInterface::isInteractiveAuthorizationAllowed() const

返回对于异步调用,调用者是否准备等待交互式授权。

默认值为false

此函数在 Qt 6.7 中引入。

另请参阅 setInteractiveAuthorizationAllowed() 和QDBusMessage::setInteractiveAuthorizationAllowed()。

bool QDBusAbstractInterface::isValid() const

如果这是远程对象的有效引用,则返回true 。如果在创建此接口时出现错误(例如,远程应用程序不存在),则返回false

注意:在处理远程对象时,并不总能在创建QDBusInterface 时确定它是否存在。

QDBusError QDBusAbstractInterface::lastError() const

返回上次操作产生的错误,如果上次操作没有产生错误,则返回无效错误。

QString QDBusAbstractInterface::path() const

返回与此接口关联的对象路径。

QString QDBusAbstractInterface::service() const

返回此接口关联的服务名称。

[since 6.7] void QDBusAbstractInterface::setInteractiveAuthorizationAllowed(bool enable)

配置异步调用时,调用方是否准备等待交互式授权。

如果enable 设置为true ,则通过此接口为异步调用生成的 D-Bus 消息将设置ALLOW_INTERACTIVE_AUTHORIZATION 标志。

只有在无权限代码调用权限较高的方法调用,且部署的授权框架允许交互式授权时,该标记才有用。

默认值为false

该功能在 Qt 6.7 中引入。

另请参阅 isInteractiveAuthorizationAllowed() 和QDBusMessage::setInteractiveAuthorizationAllowed()。

void QDBusAbstractInterface::setTimeout(int timeout)

以毫秒为单位设置今后所有 DBus 调用timeout 的超时时间。-1 表示默认的 DBus 超时时间(通常为 25 秒)。

另请参阅 timeout().

int QDBusAbstractInterface::timeout() const

以毫秒为单位返回超时值的当前值。-1 表示默认 DBus 超时(通常为 25 秒)。

另请参阅 setTimeout().

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