如何获取QDBusConnection :: connect()失败原因

时间:2016-05-18 16:14:13

标签: qt dbus qtdbus

我正试图以这种方式连接到D-Bus信号:

bool result = QDBusConnection::systemBus().connect(
    "foo.bar",  // service
    "/foo/bar", // path 
    "foo.bar",  // interface
    "SignalSomething",
    this,
    SLOT(SignalSomethingSlot()));

if( !result )
{
    // Why!?
}

QDBusConnection::connect()返回一个布尔值,如何获取扩展错误信息?如果选中QDBusConnection::lastError(),则不会返回任何有用信息(QDBusError::isValid()false)。

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,结果发现我连接的插槽具有错误的参数类型。它们必须根据Qt的documentation进行匹配,并且connect()似乎对此进行了验证,尽管没有明确提及。

  

警告:仅在参数匹配的情况下,信号才会传递到插槽。

我建议d-feet列出信号并检查其参数类型。 dbus-monitor也会列出信号,路径等,但并不总是列出确切的参数类型。


一个重要的观察结果:我在特定情况下通过使用与实际信号不同的时隙参数解决了该问题!

我想连接到here提到的com.ubuntu.Upstart0_6信号,以检测Ubuntu中的屏幕何时被锁定/解锁。 dbusmonitor打印以下内容,d-feet显示参数(String, Array of [String])

// dbusmonitor output
signal time=1529077633.579984 sender=:1.0 -> destination=(null destination) serial=809 path=/com/ubuntu/Upstart; interface=com.ubuntu.Upstart0_6; member=EventEmitted
   string "desktop-unlock"
   array [
   ]

因此信号应该是类型

void screenLockChangedUbuntu(QString event, QVector<QString> args) // connect() -> false

但这使connect()返回false。解决方案是从插槽中删除数组参数:

void screenLockChangedUbuntu(QString event) // works

我知道array参数始终为空,但是我无法解释为什么仅在删除它时才起作用。

答案 1 :(得分:0)

你可以尝试这些技巧:

1)在运行应用程序之前设置 QDBUS_DEBUG 环境变量。

export QDBUS_DEBUG=1

2)启动dbus-monitor以查看总线上发生的情况。您可能需要将全局策略设置为eavesdrop系统总线,具体取决于您的发行版。

<强>更新

您确定连接到系统总线成功了吗?如果失败,您应该检查system.conf政策,并可能在system.d中创建自己的conf。这post可能会有所帮助。

您可以先使用QDBusConnection::connectToBus连接到系统总线,然后检查QDBusConnection::isConnected是否成功。只有在此之后,您才尝试连接信号并检查是否成功。

QDBusConnection bus = QDBusConnection::connectToBus(QDBusConnection::systemBus, myConnectionName);
if (bus.isConnected())
{
    if(!bus.connect( ... ))
    {
        // Connecting to signal failed
    }
}
else
{
    // Connecting to system bus failed
}