:mod:`.backend_qtagg`, :mod:`.backend_qtcairo` ============================================== **NOTE** These backends are not (auto) documented here, to avoid adding a dependency to building the docs. .. redirect-from:: /api/backend_qt4agg_api .. redirect-from:: /api/backend_qt4cairo_api .. redirect-from:: /api/backend_qt5agg_api .. redirect-from:: /api/backend_qt5cairo_api .. module:: matplotlib.backends.qt_compat .. module:: matplotlib.backends.backend_qt .. module:: matplotlib.backends.backend_qtagg .. module:: matplotlib.backends.backend_qtcairo .. module:: matplotlib.backends.backend_qt5agg .. module:: matplotlib.backends.backend_qt5cairo .. _QT_bindings: 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 [#]_. 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 [#]_. 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 [#]_. Previously Matplotlib's Qt backends had the Qt version number in the name, both in the module and the :rc:`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 `~matplotlib.backends.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 :envvar:`QT_API` environment variable, and finally by the :rc:`backend`. In all cases when we need to search, the order is ``PyQt6``, ``PySide6``, ``PyQt5``, ``PySide2``. See :ref:`QT_API-usage` 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. .. [#] There is also `PyQt4 `_ and `PySide `_ for Qt4 but these are no longer supported by Matplotlib and upstream support for Qt4 ended in 2015. .. [#] Despite the slight API differences, the more important distinction between the PyQt and Qt for Python series of bindings is licensing. .. [#] If you are looking for a general purpose compatibility library please see `qtpy `_.