Search code examples
pythonpyqtdbuspyqt5

PyQT5 with dbus interface freezes on interspection (where PyQT4 works)


I have a following simple snippet which works on PyQT4:

from PyQt4.QtCore import QCoreApplication
import math
import dbus
import dbus.service
from dbus.mainloop.qt import DBusQtMainLoop

class Calculator(dbus.service.Object):
  def __init__(self):
    busName = dbus.service.BusName('org.calc.Calculator', bus = dbus.SessionBus())
    dbus.service.Object.__init__(self, busName, '/Calculator')

  @dbus.service.method('org.calc.Calculator', in_signature = 'dd', out_signature = 'd')
  def add(self, a, b):
      return a+b

DBusQtMainLoop(set_as_default = True)
app = QCoreApplication([])
calc = Calculator()
app.exec_()

however, if I substitute the PyQT4 import for a PyQT5 one:

from PyQt5.QtCore import QCoreApplication

the application hangs on interspection.

Any ideas how to fix this? More imporantantly, what may be the cause?


Solution

  • Turns out with PyQt5 you need to use PyQt5 specific dbus module providing the mainloop:

    from dbus.mainloop.pyqt5 import DBusQtMainLoop
    

    instead of:

    from dbus.mainloop.qt import DBusQtMainLoop