I tried to modify "Pong" PyQt example to implement two interfaces: "org.mpris.MediaPlayer2.Test1" and "org.mpris.MediaPlayer2.Test2" on same path "/org/mpris/MediaPlayer2". But second interface doesn't work.
import sys
from PyQt6.QtCore import pyqtSlot, QCoreApplication, QMetaObject, QObject
from PyQt6.QtDBus import QDBusConnection
# Main class for org.mpris.MediaPlayer2 /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Test1
class Pong(QObject):
def __init__(self, parent=None):
super().__init__(parent)
if not QDBusConnection.sessionBus().isConnected():
sys.stderr.write("Cannot connect to the D-Bus session bus.")
sys.exit(1)
if not QDBusConnection.sessionBus().registerService('org.mpris.MediaPlayer2'):
sys.stderr.write("%s\n" % QDBusConnection.sessionBus().lastError().message())
sys.exit(1)
self.setObjectName("org.mpris.MediaPlayer2")
QDBusConnection.sessionBus().registerObject("/org/mpris/MediaPlayer2", "org.mpris.MediaPlayer2.Test1", self, QDBusConnection.RegisterOption.ExportAllSlots)
print("running")
@pyqtSlot(str, result=str)
def get_message(self, arg):
QMetaObject.invokeMethod(QCoreApplication.instance(), 'quit')
print("test1 {} got called".format(arg))
return "test1 (\"%s\") got called" % arg
# Child class for org.mpris.MediaPlayer2 /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Test2
class Test2(Pong):
def __init__(self, parent=None):
super().__init__(parent)
self.setObjectName("org.mpris.MediaPlayer2.Test2")
QDBusConnection.sessionBus().registerObject("/org/mpris/MediaPlayer2", "org.mpris.MediaPlayer2.Test2", self, QDBusConnection.RegisterOption.ExportChildObjects)
@pyqtSlot(str, result=str)
def get_message(self, arg):
QMetaObject.invokeMethod(QCoreApplication.instance(), 'quit')
print("test2 {} got called".format(arg))
return "test2 (\"%s\") got called" % arg
if __name__ == '__main__':
app = QCoreApplication(sys.argv)
pong = Pong()
pongtest = Test2()
sys.exit(app.exec())
dbus-send --session --print-reply --dest=org.mpris.MediaPlayer2 /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Test1.get_message string:hello
works well.
dbus-send --session --print-reply --dest=org.mpris.MediaPlayer2 /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Test2.get_message string:hello
say that "no such interface"
I need both commands to work properly.
I expect that the code above should work like this (and without GObject only with Qt 6):
# Well working methods with GObject
@dbus.service.method("org.mpris.MediaPlayer2.Test1", in_signature='s', out_signature='s')
def get_message(self, arg):
print("test1 {} got called".format(arg))
return "test1 (\"%s\") got called" % arg
@dbus.service.method("org.mpris.MediaPlayer2.Test2", in_signature='s', out_signature='s')
def get_message(self, arg):
print("test1 {} got called".format(arg))
return "test1 (\"%s\") got called" % arg
But it seems, @dbus.service.method cannot work with Qt.