Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Dbus interface - wie kommt man an ein QDBusObjectPath ran



  • Hallo zusammen,

    ich hoffe, ich bin hier richtig und entschuldigt, wenn ich vielleicht ein paar - für euch - dämliche Fragen stelle...

    Ich versuche mich gerade gleichzeitig in Qt und dbus zurecht zu finden, da ich einen Fix für Kchildlock schreiben will. Gleichzeitig bin ich zwar in Python ziemlich fit, allerdings sind meine C++-Kenntnisse ziemlich eingerostet.
    Nun ja mit Qt-creator habe ich mich schon etwas angefreundet und das listnames-Projekt als Startpunkt gewählt.

    Wo es jetzt hapert ist folgendes:
    Auf der Konsole kann ich folgendes machen:

    @
    $> qdbus --system --literal org.freedesktop.login1 /org/freedesktop/login1/seat/seat0 org.freedesktop.DBus.Properties.Get org.freedesktop.login1.Seat ActiveSession

    [Variant: [Argument: (so) "1", [ObjectPath: /org/freedesktop/login1/session/_31]]]
    @

    Ich muss an den ObjectPath ran und hier klemmt es nun, da das wohl ein QVariant ist

    @
    QDBusInterface ckiface("org.freedesktop.login1",
    "/org/freedesktop/login1/seat/seat0",
    "org.freedesktop.DBus.Properties");

     QDBusReply<QDBusObjectPath> sessionPath = ckiface.call("org.freedesktop.DBus.Properties.Get",
                                                                 "org.freedesktop.login1.Seat",
                                                                 "ActiveSession");
    

    @

    Hier ist nun sessionPath kein wirkliches QDBusObjectPath, sondern etwas anderes.
    Ich habe schon

    @
    QDBusReply<QList<QDBusObjectPath> > sessionPath = ckiface.call("org.freedesktop.DBus.Properties.Get",
    "org.freedesktop.login1.Seat",
    "ActiveSession");
    @

    versucht, komme dann aber auch nicht recht voran, da ich in sessionPath ja eigentlich einen Pfad erwarte.
    In Python hätte ich jetzt eine Liste und könnte per sessionPath[1] zugreifen.
    Das geht aber nicht, da dann der Compiler meckert mit

    @
    listnames.cpp:74: error: no match for 'operator[]' (operand types are 'QDBusReply<QList<QDBusObjectPath> >' and 'int')
    qDebug() << "test" << sessionPath[1].value().path().toAscii();
    @

    Besser wäre so etwas wie ein dictionary, da ich hier in einigen Fällen auch mehr als einen Eintrag erwarte.

    Hat hier jemand eine Idee, wie ich weitermachen könnte?

    Gruß und Danke

    Thomas

    Einen Tag später...
    Inzwischen bin ich so weit:

    @
    QDBusConnection bus = QDBusConnection::systemBus();
    QDBusInterface dbus_iface("org.freedesktop.login1", "/org/freedesktop/login1/seat/seat0",
    "org.freedesktop.DBus.Properties", bus);
    qDebug() << dbus_iface.call("Get",
    "org.freedesktop.login1.Seat",
    "ActiveSession");
    @

    Das ergibt auf der Konsole:

    @
    QDBusMessage(type=MethodReturn, service=":1.1", signature="v", contents=([Variant: [Argument: (so) "2", [ObjectPath: /org/freedesktop/login1/session/_32]]]) )
    @

    Aber immer noch fehlt mir das letzte Stück vom Puzzle: wie komme ich an den ObjectPath ran, also wie kann ich diesen weiter verarbeiten?
    Es scheint ja ein QVariant zu sein, aber wie zerlegt man das? Aus anderen Antworten werde ich da nicht schlau und in der Doku ist dann auch nur ein String oder ein Int drin, nichts vergleichbares zu oben.

    Immer noch dankbar für Hilfe

    Thomas


Log in to reply