Search code examples
qtdbusqtdbus

How to get QDBusConnection::connect() failure reason


I'm trying to connect to a D-Bus signal this way:

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

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

QDBusConnection::connect() returns a boolean, how do I get extended error information? If a check QDBusConnection::lastError() it returns no useful information (as QDBusError::isValid() is false).


Solution

  • I had the same issue and it turned out that the slot I connected to had the wrong parameter types. They must match according to Qt's documentation and it looks like connect() verifies that, despite not explicitly mentioned.

    Warning: The signal will only be delivered to the slot if the parameters match.

    I suggest d-feet to list signals and check their parameter types. dbus-monitor does list signals, paths and such too, but not always the exact type of parameters.


    One important observation though: I fixed the issue in my particular case by using different slot parameters than the actual signal has!

    I wanted to connect to a com.ubuntu.Upstart0_6 signal mentioned here to detect when the screen in Ubuntu is locked/unlocked. dbusmonitor prints the following and d-feet shows parameters (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 [
       ]
    

    Hence the signal should be of type

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

    This however made connect() return false. The solution was to remove the array parameter from the slot:

    void screenLockChangedUbuntu(QString event) // works
    

    I am aware that the array parameter was always empty, but I cannot explain why it only worked when removing it.