Qt wiki will be updated on October 12th 2023 starting at 11:30 AM (EEST) and the maintenance will last around 2-3 hours. During the maintenance the site will be unavailable.

Qt for Python DBusIntegration

From Qt Wiki
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.