How to create multiple interfaces on same path by QDBusConnection?

27 Views Asked by At

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.

0

There are 0 best solutions below