dbus会话连接:用qt槽连接dbus信号,怎么做?

Posted

技术标签:

【中文标题】dbus会话连接:用qt槽连接dbus信号,怎么做?【英文标题】:dbus session connections: connecting dbus signals with qt slots, how can it be done? 【发布时间】:2015-03-16 11:08:36 【问题描述】:

所以,在我的一生中,我无法让我的对象连接到会话总线。所以,我试图将“my_obj”的“唤醒”连接到 dBus 信号“profileChanged”。但是,即使我确定(通过 qbusviewer)正在发出这个信号,“唤醒”也不会运行。这是我的代码的 sn-p:

const QString service = "org.kde.Solid.PowerManagement";
const QString path = "/org/kde/Solid/PowerManagement";
const QString interface = "org.kde.Solid.PowerManagement";    

QDBusConnection bus = QDBusConnection::sessionBus();

if (!bus.isConnected()) 

      qDebug() << "Can't connect to the D-Bus session bus.\n";
                

class my_wake_up_class : public QObject

      Q_OBJECT
public slots:
      void wakeup(QString); //Does not run!
;

my_wake_up_class my_obj;

bool conn = bus.connect(service, path, interface, "profileChanged", &my_obj, SLOT(wakeup(QString)));
if (!conn) qDebug() << "not connected";

qDBus 显示“profileChanged”的格式为“void (QString)”,我没有收到任何错误或警告。这是该特定信号的 qdbus 输出:

signal void org.kde.Solid.PowerManagement.profileChanged(QString)

所以,我认为这会奏效。我确定我遗漏了一些隐藏在某些文档中的微小细节。有人知道我哪里出错了吗?

【问题讨论】:

【参考方案1】:

所以,qtforum.org 上的好人嘲笑我的无知。显然,我需要启用 Qt 事件系统。通常这是由我没有包含的 QApplication 类完成的。包含后,一切正常。

【讨论】:

以上是关于dbus会话连接:用qt槽连接dbus信号,怎么做?的主要内容,如果未能解决你的问题,请参考以下文章

QT-Dbus 信号/插槽?

Qt DBus 连接不使用 SLOT 参数中的 typedef

基于 DBusGProxy 连接 dbus 信号失败

使用系统 DBus 的 registerService 失败(但适用于会话 DBus)

无法取消注册 ble 通知的 dbus 信号

e NetworkManager *** 连接的 dbus 信号处理程序