[PyQt] QtDBus not wrapped, trouble using dbus-python (communication hangs)

Phil Thompson phil at riverbankcomputing.com
Thu Mar 13 22:03:08 GMT 2008


On Thursday 13 March 2008, Adeodato Simó wrote:
> Hello.
>
> I've read in the list archives that QtDBus is not wrapped because there
> would be severe limitations in the bindings, and a more pythonic version
> of the bindings exists (dbus-python).
>
> However, I'm having trouble with exporting an interface using those
> bindings. I've started with the example-service.py file that comes with
> dbus-python, and I've changed it to be a Qt mini-app with the following
> diff (full file attached):
>
> --- example-service.py~
> +++ example-service.py
> @@ -30,11 +30,13 @@
>  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>  # DEALINGS IN THE SOFTWARE.
>
> -import gobject
> +import sys
>
>  import dbus
>  import dbus.service
> -import dbus.mainloop.glib
> +import dbus.mainloop.qt
> +
> +from PyQt4 import QtGui
>
>  class DemoException(dbus.DBusException):
>      _dbus_error_name = 'com.example.DemoException'
> @@ -71,13 +73,13 @@
>
>
>  if __name__ == '__main__':
> -    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
> +    dbus.mainloop.qt.DBusQtMainLoop(set_as_default=True)
>
>      session_bus = dbus.SessionBus()
>      name = dbus.service.BusName("com.example.SampleService", session_bus)
>      object = SomeObject(session_bus, '/SomeObject')
>
> -    mainloop = gobject.MainLoop()
> -    print "Running example service."
> -    print usage
> -    mainloop.run()
> +    app = QtGui.QApplication(sys.argv)
> +    mw = QtGui.QMainWindow()
> +    mw.show()
> +    app.exec_()
>
> The application starts, with this warning:
>
>   QSocketNotifier: Can only be used with threads started with QThread
>   QSocketNotifier: Can only be used with threads started with QThread
>
> qdbus lists the service, but trying to lists its objects hangs, and
> sending a message does not work either:
>
> % qdbus | grep example
>  com.example.SampleService
>
> % qdbus com.example.SampleService
> /
> Cannot introspect object / at com.example.SampleService:
> org.freedesktop.DBus.Error.NoReply (Did not receive a reply. Possible
> causes include: the remote application did not send a reply, the message
> bus security policy blocked the reply, the reply timeout expired, or the
> network connection was broken.)
>
> % qdbus com.example.SampleService /SomeObject
> com.example.SampleInterface.HelloWorld hello Interface
> 'com.example.SampleInterface' not available in object /SomeObject at
> com.example.SampleService: org.freedesktop.DBus.Error.NoReply (...)
>
> Any ideas?

You need to create the QApplication before the main loop.

Phil



More information about the PyQt mailing list