Wie macht man Methoden und Eigenschaften auf DBus mit einem QDBusAbstractAdaptor mit PyQt4 verfügbar?
Ich versuche mit PyQt4, speziell QtDBus, einen Basiscode auf DBus zum Laufen zu bringen. Ich verwende eine Python3-Version von PyQt4. Ich habe bereits den Code erhalten, den ich auf Qt (c ++) ausführen möchte, möchte aber, dass ähnlicher Code nur mit Python ausgeführt wird. Ich möchte Methoden, Signale / Slots und Eigenschaften auf DBus verfügbar machen, damit andere Python-Codes aufgerufen werden können.
In Qt verwenden Sie das Makro / die Funktion Q_CLASSINFO, um die DBus-Introspektion durchzuführen. Obwohl ich die Q_CLASSINFO-Methode verwendet habe, kann ich sie nicht dazu bringen, dieselbe Art von Funktionalität zu erzeugen. Soweit ich das beurteilen kann, gibt es keine Dokumentation zur Q_CLASSINFO-Methode, daher bin ich mir nicht sicher, ob es einen anderen Weg gibt. Unter Verwendung von D-Feet kann ich deutlich erkennen, dass keine Methoden automatisch belichtet werden, also stecke ich irgendwie fest.
Folgendes habe ich bisher.
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()
Während ich die Verwendung von QtDBus in C ++ sehr mag, weil ich dieses große Projekt von mir strukturieren möchte, muss das Objekt, auf das über DBus zugegriffen wird, in Python3 geschrieben werden.