Jak ujawnić metody i właściwości w DBus przy użyciu QDBusAbstractAdaptor z PyQt4?

Próbuję uzyskać jakiś podstawowy kod działający na DBus za pomocą PyQt4, w szczególności QtDBus. Używam wersji PyQt4 Python3. Dostałem już kod, który chcę uruchomić na Qt (c ++), ale chcę uzyskać podobny kod działający tylko przy użyciu Pythona. Chcę ujawnić metody, sygnały / szczeliny i właściwości w DBus, aby wywołać inny kod Pythona.

W Qt używasz makro / funkcji Q_CLASSINFO do wykonywania introspekcji DBus. Podczas gdy korzystałem z metody Q_CLASSINFO, nie mogę uzyskać tej samej funkcjonalności. O ile wiem, nie ma żadnej dokumentacji dotyczącej metody Q_CLASSINFO, więc nie jestem pewien, czy istnieje inny sposób. Używając D-Feet, wyraźnie widzę, że żadne metody nie są ujawniane automatycznie, więc utknąłem.

Oto, co mam do tej pory.

from PyQt4 import QtDBus
from PyQt4.QtCore import QCoreApplication, QObject, Q_CLASSINFO, pyqtSlot, pyqtProperty
from PyQt4.QtDBus import QDBusConnection, QDBusAbstractAdaptor

SERVICE = 'com.home.dbus'

class MyServer(QObject):


    def __init__(self):
        QObject.__init__(self)
        self.__dbusAdaptor = ServerAdaptor(self)

    def close(self):
        pass

    def echo(self, value):
        echoed = 'Received {0}'.format(value)
        return echoed

    def name(self):
        return 'myname'

    def dbus_adaptor(self):
        return self.__dbusAdaptor

class ServerAdaptor(QDBusAbstractAdaptor):
    """ This provides the DBus adaptor to the outside world"""

    def __init__(self, parent):
        super().__init__(parent)
        self.__parent = parent
        Q_CLASSINFO("D-Bus Introspection",
        "  <interface name=\"com.home.dbus\">\n"
        "    <method name=\"name\">\n"
        "      <arg direction=\"out\" type=\"s\" name=\"name\"/>\n"
        "    </method>\n"
        "    <method name=\"echo\">\n"
        "      <arg direction=\"in\" type=\"s\" name=\"phrase\"/>\n"
        "      <arg directory=\"out\" type=\"s\" name=\"echoed\"/>\n"
        "    </method>\n"
        "  </interface>\n")

    def close(self):
        parent.close()

    def echo(self, value):
        return parent.echo(value)

    def name(self):
        return parent.name

def start():
    app = QCoreApplication([])
    if QDBusConnection.sessionBus().isConnected() == False:
        print('Cannot connect to D-Bus session bus')
        return
    print('Starting')
    server = MyServer()
    if not QDBusConnection.sessionBus().registerService(SERVICE):
        print('Unable to register service name')
        return
    if not QDBusConnection.sessionBus().registerObject('/mydbus', server.dbus_adaptor):
        print('Unable to register object at service path')
        return
    app.exec();
    print('Exited')

if __name__ == '__main__':
    start()

Chociaż naprawdę lubię używać QtDBus w C ++ z powodu tego, jak chcę skonstruować ten duży projekt, naprawdę potrzebuję obiektu dostępnego za pośrednictwem DBus do napisania w Pythonie3.

questionAnswers(1)

yourAnswerToTheQuestion