[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