Qt for Python DBusIntegration
Jump to navigation Jump to search
To get PySide2 and DBus working together you can use the glib mainloop integration already done in dbus-python.
The examples below show how to export Qt objects to Python and emit a D-Bus signal when a Qt signal is emitted. The code comments explain what you need to know about PySide2 and D-Bus.
Also refer to the dbus-python tutorial.
D-Bus Client
#!/usr/bin/env python # -'''- coding: utf-8 -'''- # DBUS Client using PySide2 integration import sys from traceback import print_exc # import python dbus module import dbus # import python dbus GLib mainloop support import dbus.mainloop.glib # import QtCore from PySide2.QtCore import * # signal handler def button_clicked(): print("button clicked") # main function if __name__ == '__main__': # Enable glib main loop support dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) # Get the session bus bus = dbus.SessionBus() try: # Get the remote object remote_object = bus.get_object("com.example.SampleService", "/DBusWidget") # Get the remote interface for the remote object iface = dbus.Interface(remote_object, "com.example.SampleWidget") except dbus.DBusException: print_exc() sys.exit(1) # Start the application app = QCoreApplication([]) # Call some methods of the remote interface iface.show() iface.setText("Emit signal") # connect the DBus signal clicked to the function button_clicked iface.connect_to_signal("clicked", button_clicked) iface.connect_to_signal("lastWindowClosed", app.quit) # enter in the main loop app.exec_()
D-Bus Server
#!/usr/bin/env python #-'''- coding: utf-8 -'''- # DBUS Server Example of use PySide2 with dbus-python library import dbus import dbus.service import dbus.mainloop.glib import random from PySide2.QtCore import * from PySide2.QtWidgets import QPushButton, QApplication # The adaptor, MUST inherit dbus.service.Object class DBusWidget(dbus.service.Object): def __init__(self, name, session): # export this object to dbus dbus.service.Object.__init__(self, name, session) # create a simple widget self.widget = QPushButton() self.widget.resize(200, 50) # To export a Qt signal as a DBus-signal, you need to connect it to # a method in this class. # The method MUST have the signal annotation, so dbus-python will # export it as a dbus-signal QObject.connect(self.widget, SIGNAL ("clicked()"), self.clicked) QObject.connect(QApplication.instance(), SIGNAL ("lastWindowClosed()"), self.lastWindowClosed) # You can export methods to dbus like you do in python-dbus. @dbus.service.method("com.example.SampleWidget", in_signature='', out_signature='') def show(self): self.widget.show() # Another method… now with a parameter @dbus.service.method("com.example.SampleWidget", in_signature='s', out_signature='') def setText(self, value): self.widget.setText(value) # Another one… @dbus.service.method("com.example.SampleWidget", in_signature='', out_signature='') def exit(self): qApp().quit() # A signal that will be exported to dbus @dbus.service.signal("com.example.SampleWidget", signature='') def clicked(self): pass # Another signal that will be exported to dbus @dbus.service.signal("com.example.SampleWidget", signature='') def lastWindowClosed(self): pass if __name__ == "__main__": print("holi") app = QApplication([]) # Use qt/glib mainloop integration to get dbus mainloop working dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) session_bus = dbus.SessionBus() print(session_bus) # Export the service name = dbus.service.BusName("com.example.SampleService", session_bus) # Export the object widget = DBusWidget(session_bus, '/DBusWidget') print("Running
Running the examples
Copy the client code to a file called example-client.py and the server to a file called example-server.py and type:
python example-server.py & python example-client.py
A small window should appear on screen. Click on the button to emit a Qt signal. The signal will be converted to a D-Bus signal that will be caught by our D-Bus client.