Interfacing with Qt widgets

When designing GUIs, it can be useful to have class properties link directly to widgets. Echo currently includes functions to connect to Qt widgets, which are described below. Contributions for other GUI frameworks are welcome!

We recommend using Qt libraries via the QtPy package, which provides a uniform API to PyQt4, PyQt5, and PySide, and we use this in the following examples.

Let’s assume we have a simple Qt window with a single checkbox:

from qtpy import QtWidgets

class MySimpleWindow(QtWidgets.QMainWindow):

    def __init__(self, parent=None):
        super(MySimpleWindow, self).__init__(parent=parent)
        self.checkbox = QtWidgets.QCheckBox()

We can now add a callback property to the class and connect the property to the Qt checkbox:

from qtpy import QtWidgets
from echo import CallbackProperty
from echo.qt import connect_checkable_button

class MySimpleWindow(QtWidgets.QMainWindow):

    active = CallbackProperty(True)

    def __init__(self, parent=None):
        super(MySimpleWindow, self).__init__(parent=parent)
        self.checkbox = QtWidgets.QCheckBox()
        self.setCentralWidget(self.checkbox)
        self._connection = connect_checkable_button(self, 'active', self.checkbox)

Note that the connection object needs to be stored in a variable, as one there are no references left to the connection object, the connection is removed.

Let’s now write a small script that uses this Qt window and adds a callback when active is changed:

from echo import add_callback

def toggled(new):
    print("Checkbox toggled: %s" % new)

app = QtWidgets.QApplication([''])
window = MySimpleWindow()
window.show()

add_callback(window, 'active', toggled)

app.exec_()

If you run this script, and click on the checkbox multiple times, the output in the terminal will be:

Checkbox toggled: False
Checkbox toggled: True
Checkbox toggled: False

In addition, if you need to access the value of the checkbox in the code, you can now simply access window.active rather than window.checkbox.isChecked.

A number of other functions are available to connect to other types of widgets, including combo boxes and text fields - see the API documentation for the Qt helpers for more details.