backend_qtagg, backend_qtcairo#

NOTE These backends are not (auto) documented here, to avoid adding a dependency to building the docs.

Qt Bindings#

There are currently 2 actively supported Qt versions, Qt5 and Qt6, and two supported Python bindings per version -- PyQt5 and PySide2 for Qt5 and PyQt6 and PySide6 for Qt6 [1]. While both PyQt and Qt for Python (aka PySide) closely mirror the underlying C++ API they are wrapping, they are not drop-in replacements for each other [2]. To account for this, Matplotlib has an internal API compatibility layer in matplotlib.backends.qt_compat which covers our needs. Despite being a public module, we do not consider this to be a stable user-facing API and it may change without warning [3].

Previously Matplotlib's Qt backends had the Qt version number in the name, both in the module and the rcParams["backend"] value (e.g. matplotlib.backends.backend_qt4agg and matplotlib.backends.backend_qt5agg). However as part of adding support for Qt6 we were able to support both Qt5 and Qt6 with a single implementation with all of the Qt version and binding support handled in qt_compat. A majority of the renderer agnostic Qt code is now in matplotlib.backends.backend_qt with specialization for AGG in backend_qtagg and cairo in backend_qtcairo.

The binding is selected at run time based on what bindings are already imported (by checking for the QtCore sub-package), then by the QT_API environment variable, and finally by the rcParams["backend"]. In all cases when we need to search, the order is PyQt6, PySide6, PyQt5, PySide2. See How do I select the Qt implementation? for usage instructions.

The backend_qt5, backend_qt5agg, and backend_qt5cairo are provided and force the use of a Qt5 binding for backwards compatibility. Their use is discouraged (but not deprecated) and backend_qt, backend_qtagg, or backend_qtcairo should be preferred instead. However, these modules will not be deprecated until we drop support for Qt5.