本页内容

QDBusConnection Class

QDBusConnection 类表示与 D-Bus 总线守护进程的连接。更多内容...

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

公共类型

enum BusType { SessionBus, SystemBus, ActivationBus }
flags ConnectionCapabilities
enum ConnectionCapability { UnixFileDescriptorPassing }
enum RegisterOption { ExportAdaptors, ExportScriptableSlots, ExportScriptableSignals, ExportScriptableProperties, ExportScriptableInvokables, …, ExportChildObjects }
flags RegisterOptions
enum UnregisterMode { UnregisterNode, UnregisterTree }

公共函数

QDBusConnection(const QString &name)
QDBusConnection(const QDBusConnection &other)
~QDBusConnection()
QDBusPendingCall asyncCall(const QDBusMessage &message, int timeout = -1) const
QString baseService() const
QDBusMessage call(const QDBusMessage &message, QDBus::CallMode mode = QDBus::Block, int timeout = -1) const
bool callWithCallback(const QDBusMessage &message, QObject *receiver, const char *returnMethod, const char *errorMethod, int timeout = -1) const
bool connect(const QString &service, const QString &path, const QString &interface, const QString &name, QObject *receiver, const char *slot)
bool connect(const QString &service, const QString &path, const QString &interface, const QString &name, const QString &signature, QObject *receiver, const char *slot)
bool connect(const QString &service, const QString &path, const QString &interface, const QString &name, const QStringList &argumentMatch, const QString &signature, QObject *receiver, const char *slot)
QDBusConnection::ConnectionCapabilities connectionCapabilities() const
bool disconnect(const QString &service, const QString &path, const QString &interface, const QString &name, QObject *receiver, const char *slot)
bool disconnect(const QString &service, const QString &path, const QString &interface, const QString &name, const QString &signature, QObject *receiver, const char *slot)
bool disconnect(const QString &service, const QString &path, const QString &interface, const QString &name, const QStringList &argumentMatch, const QString &signature, QObject *receiver, const char *slot)
QDBusConnectionInterface *interface() const
bool isConnected() const
QDBusError lastError() const
QString name() const
QObject *objectRegisteredAt(const QString &path) const
bool registerObject(const QString &path, QObject *object, QDBusConnection::RegisterOptions options = ExportAdaptors)
bool registerObject(const QString &path, const QString &interface, QObject *object, QDBusConnection::RegisterOptions options = ExportAdaptors)
bool registerService(const QString &serviceName)
bool send(const QDBusMessage &message) const
void swap(QDBusConnection &other)
void unregisterObject(const QString &path, QDBusConnection::UnregisterMode mode = UnregisterNode)
bool unregisterService(const QString &serviceName)
QDBusConnection &operator=(const QDBusConnection &other)

静态公共成员

QDBusConnection connectToBus(QDBusConnection::BusType type, const QString &name)
QDBusConnection connectToBus(const QString &address, const QString &name)
QDBusConnection connectToPeer(const QString &address, const QString &name)
void disconnectFromBus(const QString &name)
void disconnectFromPeer(const QString &name)
QByteArray localMachineId()
QDBusConnection sessionBus()
QDBusConnection systemBus()

详细说明

该类是 D-Bus 会话的起点。通过它,您可以访问远程对象和接口;将远程信号连接到您对象的槽;注册对象等。

D-Bus 连接是通过connectToBus() 函数创建的,该函数会打开与服务器守护进程的连接并执行初始握手,同时将该连接与一个名称关联起来。此后,使用同一名称进行连接的尝试将返回相同的连接。

随后,可通过调用disconnectFromBus() 函数关闭该连接。

一旦断开连接,调用connectToBus() 将无法重新建立连接,您必须创建一个新的 QDBusConnection 实例。

为了方便处理两种最常见的连接类型,sessionBus() 和systemBus() 函数分别返回与会话服务器守护进程和系统服务器守护进程的已建立连接。这些连接在首次使用时被打开,并在QCoreApplication 析构函数执行时关闭。

D-Bus 还支持点对点连接,无需总线服务器守护进程。利用此功能,两个应用程序可以相互通信并交换消息。这可以通过向connectToBus() 函数传递一个地址来实现,该地址是由另一个 D-Bus 应用程序使用QDBusServer 打开的。

成员类型文档

enum QDBusConnection::BusType

指定总线连接的类型。有效的总线类型包括:

常量值描述
QDBusConnection::SessionBus0会话总线,与正在运行的桌面会话相关联
QDBusConnection::SystemBus1系统总线,用于与全系统进程通信
QDBusConnection::ActivationBus2激活总线,即启动该服务的总线的“别名”

在会话总线上,可以找到同一用户正在共享同一桌面会话的其他应用程序(因此得名)。而在系统总线上,通常则会找到供整个系统共享的进程。

enum QDBusConnection::ConnectionCapability
flags QDBusConnection::ConnectionCapabilities

此枚举描述了 D-Bus 连接的可用功能。

常量值描述
QDBusConnection::UnixFileDescriptorPassing0x0001允许将 Unix 文件描述符传递给其他进程(参见QDBusUnixFileDescriptor )

ConnectionCapabilities 类型是QFlags<ConnectionCapability> 的 typedef。它存储 ConnectionCapability 值的按“或”运算组合。

另请参阅 connectionCapabilities()。

enum QDBusConnection::RegisterOption
flags QDBusConnection::RegisterOptions

指定将对象注册到连接时的选项。可能的值包括:

常量值描述
QDBusConnection::ExportAdaptors0x01导出该对象中找到的适配器的内容
QDBusConnection::ExportScriptableSlots0x10导出该对象的可脚本化槽
QDBusConnection::ExportScriptableSignals0x20导出该对象的可脚本化信号
QDBusConnection::ExportScriptableProperties0x40导出该对象的可脚本属性
QDBusConnection::ExportScriptableInvokables0x80导出该对象的可脚本化可调用项
QDBusConnection::ExportScriptableContents0xf0ExportScriptableSlots | ExportScriptableSignals | ExportScriptableProperties 的简写形式
QDBusConnection::ExportNonScriptableSlots0x100导出该对象的非可脚本化槽
QDBusConnection::ExportNonScriptableSignals0x200导出该对象的非可脚本化信号
QDBusConnection::ExportNonScriptableProperties0x400导出该对象的非可脚本化属性
QDBusConnection::ExportNonScriptableInvokables0x800导出该对象的非可脚本化可调用项
QDBusConnection::ExportNonScriptableContents0xf00ExportNonScriptableSlots | ExportNonScriptableSignals | ExportNonScriptableProperties 的简写形式
QDBusConnection::ExportAllSlotsExportScriptableSlots|ExportNonScriptableSlots导出该对象的所有插槽
QDBusConnection::ExportAllSignalsExportScriptableSignals|ExportNonScriptableSignals导出该对象的所有信号
QDBusConnection::ExportAllPropertiesExportScriptableProperties|ExportNonScriptableProperties导出该对象的所有属性
QDBusConnection::ExportAllInvokablesExportScriptableInvokables|ExportNonScriptableInvokables导出该对象的所有可调用项
QDBusConnection::ExportAllContentsExportScriptableContents|ExportNonScriptableContents导出该对象的所有内容
QDBusConnection::ExportChildObjects0x1000导出该对象的子对象

RegisterOptions 类型是QFlags<RegisterOption> 的 typedef。它存储 RegisterOption 值的按“或”运算组合。

另请参阅 registerObject()、QDBusAbstractAdaptor 以及“使用适配器”。

enum QDBusConnection::UnregisterMode

取消注册对象路径的模式:

常量值描述
QDBusConnection::UnregisterNode0仅注销此节点:不注销子对象
QDBusConnection::UnregisterTree1取消注册此节点及其整个子树

但请注意,如果该对象是在启用ExportChildObjects 选项的情况下注册的,则UnregisterNode也会注销其子对象。

成员函数文档

[explicit] QDBusConnection::QDBusConnection(const QString &name)

创建一个与名为name 的连接关联的QDBusConnection对象。

这不会打开该连接。您必须调用connectToBus() 才能打开它。

QDBusConnection::QDBusConnection(const QDBusConnection &other)

创建other 连接的副本。

[noexcept] QDBusConnection::~QDBusConnection()

释放该对象。这不会关闭连接:若要关闭连接,必须调用disconnectFromBus()。

QDBusPendingCall QDBusConnection::asyncCall(const QDBusMessage &message, int timeout = -1) const

通过此连接发送message ,并立即返回。此函数仅适用于方法调用。它返回一个类型为QDBusPendingCall 的对象,可用于跟踪响应的状态。

如果在timeout 毫秒内未收到回复,将自动返回一个错误,表明调用已超时。 默认的timeout 为-1,该值将被替换为适合进程间通信的、由实现定义的值(通常为25秒)。此超时时间也是在QDBusPendingCall::waitForFinished()中等待的上限。

有关更便捷的调用方式,请参阅QDBusInterface::asyncCall()函数。

注意: 由于实现上的限制,对应用程序自身注册的对象进行的方法 调用绝不会是异步的。

QString QDBusConnection::baseService() const

如果该QDBusConnection 对象已建立连接,则返回此连接的唯一连接名称;否则返回空的QString 。

唯一连接名称是一个格式为“:x.xxx”(其中 x 代表十进制数字)的字符串,由 D-Bus 服务器守护进程在建立连接时分配。它用于在总线中唯一标识此客户端。

对于点对点连接,此函数将返回一个空的QString 。

QDBusMessage QDBusConnection::call(const QDBusMessage &message, QDBus::CallMode mode = QDBus::Block, int timeout = -1) const

通过此连接发送message ,并阻塞等待响应,最多等待timeout 毫秒。此函数仅适用于方法调用。它将响应消息作为返回值,该值类型为QDBusMessage::ReplyMessage 或QDBusMessage::ErrorMessage 之一。

如果在timeout 毫秒内未收到回复,将自动发送一条错误,指示调用已超时。默认的timeout 为 -1,将被替换为适合进程间通信的、由实现定义的值(通常为 25 秒)。

有关更友好的调用方式,请参阅QDBusInterface::call() 函数。

警告:如果 mode 的值为QDBus::BlockWithGui ,则该函数将重新进入 Qt 事件循环以等待响应。在等待期间,它可能会向您的应用程序发送信号和其他方法调用。因此,每次使用 call() 发起调用时,应用程序都必须做好处理可重入情况的准备。

bool QDBusConnection::callWithCallback(const QDBusMessage &message, QObject *receiver, const char *returnMethod, const char *errorMethod, int timeout = -1) const

通过此连接发送message ,并立即返回。收到响应后,将调用receiver 对象中的returnMethod 方法。如果发生错误,则会调用errorMethod 方法。

如果在timeout 毫秒内未收到回复,将自动返回一个错误,表明调用已超时。默认的timeout 为 -1,该值将被替换为适合进程间通信的实现定义值(通常为 25 秒)。

此函数仅适用于方法调用。只要参数类型匹配且未发生错误,则保证该插槽将随回复被调用 exactly once。

如果消息已发送,则返回true ;如果无法发送消息,则返回false。

bool QDBusConnection::connect(const QString &service, const QString &path, const QString &interface, const QString &name, QObject *receiver, const char *slot)

将由参数service 、path 、interface 和name 指定的信号连接到对象receiver 中的插槽slot 。参数service 和path 可以为空,表示从任何远程应用程序连接到 (interface,name) 这对信号中的任意一个。

若连接成功,则返回true 。

警告: 只有当参数匹配时,信号才会被传递到槽中。此验证只能在接收信号时进行,而不能在连接时进行。

bool QDBusConnection::connect(const QString &service, const QString &path, const QString &interface, const QString &name, const QString &signature, QObject *receiver, const char *slot)

将信号连接到对象 `receiver` 中的槽 `slot `。与之前的 `connect()` 重载不同,该函数允许用户通过 `signature ` 变量指定要连接的参数签名。随后,该函数将验证该签名是否能传递给由 `slot ` 指定的槽,否则返回 `false`。

如果连接成功,则返回true 。

注意:此 函数仅验证信号签名是否与插槽的参数匹配,但不验证远程服务中是否确实存在具有该签名的实际信号。

这是一个重载函数。

bool QDBusConnection::connect(const QString &service, const QString &path, const QString &interface, const QString &name, const QStringList &argumentMatch, const QString &signature, QObject *receiver, const char *slot)

将信号连接到对象receiver 中的插槽slot 。与之前的connect()重载不同,该函数允许通过signature 变量指定要连接的参数签名。随后,该函数将验证该签名是否能传递给由slot 指定的插槽,否则返回false。

argumentMatch 参数按顺序列出了待匹配的字符串参数。请注意,若要匹配空字符串,需传入一个为空但非 null 的QString (即QString(""))。若QString 为 null,则跳过该位置的匹配。

如果连接成功,则返回true 。

注意:此 函数会验证信号签名是否与插槽的参数匹配,但不会验证远程服务中是否确实存在具有该签名的实际信号。

这是一个重载函数。

[static] QDBusConnection QDBusConnection::connectToBus(QDBusConnection::BusType type, const QString &name)

建立一个类型为type 的连接,连接到已知的总线之一,并为其分配连接名称name 。返回一个与该连接关联的QDBusConnection 对象。

[static] QDBusConnection QDBusConnection::connectToBus(const QString &address, const QString &name)

建立与地址为address 的私有总线之间的连接,并为其分配连接名称name 。返回一个与该连接关联的QDBusConnection 对象。

[static] QDBusConnection QDBusConnection::connectToPeer(const QString &address, const QString &name)

在地址address 上建立一个点对点连接,并为其关联连接名称name 。返回一个与该连接关联的QDBusConnection 对象。

QDBusConnection::ConnectionCapabilities QDBusConnection::connectionCapabilities() const

返回与总线服务器或对等方协商确定的此连接的功能。如果该QDBusConnection 未连接,则此函数不返回任何功能。

bool QDBusConnection::disconnect(const QString &service, const QString &path, const QString &interface, const QString &name, QObject *receiver, const char *slot)

将由参数service 、path 、interface 和name 指定的信号从对象receiver 中的插槽slot 中断开连接。这些参数必须与传递给connect()函数的参数相同。

如果断开连接成功,则返回true 。

bool QDBusConnection::disconnect(const QString &service, const QString &path, const QString &interface, const QString &name, const QString &signature, QObject *receiver, const char *slot)

将由参数service 、path 、interface 、name 和signature 指定的信号从对象receiver 中的插槽slot 断开连接。这些参数必须与传递给connect()函数的参数相同。

若断开连接成功,则返回true 。

这是一个重载函数。

bool QDBusConnection::disconnect(const QString &service, const QString &path, const QString &interface, const QString &name, const QStringList &argumentMatch, const QString &signature, QObject *receiver, const char *slot)

将由参数service 、path 、interface 、name 、argumentMatch 和signature 指定的信号从对象receiver 中的插槽slot 断开连接。这些参数必须与传递给connect()函数的参数相同。

若断开连接成功,则返回true 。

这是一个重载函数。

[static] void QDBusConnection::disconnectFromBus(const QString &name)

关闭名称为name 的总线连接。

请注意,如果仍有与该连接关联的QDBusConnection 对象,则在所有引用都被释放之前,该连接不会被关闭。但是,无法再使用QDBusConnection 构造函数创建新的引用。

[static] void QDBusConnection::disconnectFromPeer(const QString &name)

关闭名称为name 的对等连接。

请注意,如果仍有与该连接关联的QDBusConnection 对象,则在所有引用都被释放之前,该连接不会被关闭。但是,无法再使用QDBusConnection 构造函数创建新的引用。

QDBusConnectionInterface *QDBusConnection::interface() const

返回一个QDBusConnectionInterface 对象,该对象表示此连接上的D-Bus服务器接口。

bool QDBusConnection::isConnected() const

如果该QDBusConnection 对象已连接,则返回 `true `。

QDBusError QDBusConnection::lastError() const

返回此连接中发生的最后一个错误。

此函数专为低级代码设计。若使用QDBusInterface::call(),错误代码将通过其返回值返回。

另请参阅 QDBusInterface 和QDBusMessage 。

[static] QByteArray QDBusConnection::localMachineId()

返回 D-Bus 系统所识别的本地机器 ID。每个运行 D-Bus 的节点或主机都拥有一个唯一的标识符,当它们共享文件系统等资源时,该标识符可用于将其与其他主机区分开来。

请注意,本地机器 ID 不能保证在系统重启后仍然存在,因此不应将此标识符存储在持久存储(如文件系统)中。它仅在本次启动会话的生命周期内保证保持不变。

QString QDBusConnection::name() const

返回此连接的连接名称,该名称作为 name 参数传递给connectToBus()。

连接名称可用于唯一标识与总线建立的实际底层连接。从单个连接创建的副本将始终隐式共享底层连接,因此将具有相同的连接名称。

反之,两个具有不同连接名称的连接,要么始终连接到不同的总线,要么在同一总线上具有不同的唯一名称(由baseService() 返回)。

另请参阅 connectToBus() 和disconnectFromBus()。

QObject *QDBusConnection::objectRegisteredAt(const QString &path) const

返回通过 `registerObject()` 注册的对象,该对象位于由 `path` 指定的对象路径下。

bool QDBusConnection::registerObject(const QString &path, QObject *object, QDBusConnection::RegisterOptions options = ExportAdaptors)

将对象object 注册到路径path ,如果注册成功,则返回true 。参数options 指定将通过 D-Bus 暴露对象object 的哪些部分。

此函数不会覆盖现有对象:如果路径path 上已有注册对象,则该函数将返回 false。请先使用unregisterObject() 取消其注册。

ExportChildObjects 标志会根据已注册对象的路径以及子对象的QObject::objectName ,在 D-Bus 上导出子对象。因此,子对象必须具有对象名称,这一点非常重要。

您无法将某个对象注册为已通过 `ExportChildObjects` 注册的对象的子对象。

bool QDBusConnection::registerObject(const QString &path, const QString &interface, QObject *object, QDBusConnection::RegisterOptions options = ExportAdaptors)

将对象object 注册到路径path ,接口名称为interface ;如果注册成功,则返回true 。参数options 指定将通过 D-Bus 暴露对象object 的哪些部分。

此函数不会覆盖现有对象:如果路径path 下已有注册对象,则该函数将返回 false。请先使用unregisterObject() 取消其注册。

ExportChildObjects 标志会根据已注册对象的路径及其子对象的QObject::objectName ,在 D-Bus 上导出子对象。因此,子对象必须具有对象名称,这一点非常重要。

您无法将一个对象注册为已通过 `ExportChildObjects` 注册的对象的子对象。

这是一个重载函数。

bool QDBusConnection::registerService(const QString &serviceName)

尝试将serviceName 注册到D-Bus服务器上,如果注册成功,则返回true 。如果该名称已被其他应用程序注册,则注册将失败。

另请参阅 unregisterService() 和QDBusConnectionInterface::registerService()。

bool QDBusConnection::send(const QDBusMessage &message) const

通过此连接发送message ,且不等待响应。这适用于错误、信号和返回值,以及那些无需返回值的调用。

如果消息成功入队,则返回 `true `;否则返回 `false`。

[static] QDBusConnection QDBusConnection::sessionBus()

返回一个通过会话总线打开的QDBusConnection 对象。该函数返回的对象引用在应用程序终止之前一直有效;此时,连接将被关闭,该对象也将被删除。

[noexcept] void QDBusConnection::swap(QDBusConnection &other)

将此连接替换为other 。此操作非常快速,且绝不会失败。

[static] QDBusConnection QDBusConnection::systemBus()

返回一个通过系统总线打开的QDBusConnection 对象。该函数返回的对象引用在QCoreApplication 的析构函数执行之前一直有效;此时连接将被关闭,对象也将被删除。

void QDBusConnection::unregisterObject(const QString &path, QDBusConnection::UnregisterMode mode = UnregisterNode)

取消注册通过registerObject()注册的、位于path 指定的对象路径下的对象;如果mode 的值为QDBusConnection::UnregisterTree ,则同时取消注册该对象的所有子对象。

请注意,无法注销未通过registerObject() 注册的对象。

bool QDBusConnection::unregisterService(const QString &serviceName)

取消注册先前通过registerService() 注册的服务serviceName ,如果操作成功,则返回true 。

另请参阅 registerService() 和QDBusConnectionInterface::unregisterService()。

QDBusConnection &QDBusConnection::operator=(const QDBusConnection &other)

在此对象中创建连接other 的副本。请注意,该对象在复制之前引用的连接不会自动断开。

另请参阅 disconnectFromBus()。

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