matplotlib.backends.backend_qtagg, matplotlib.backends.backend_qtcairo#

注意 这些 后端 在这里没有(自动)记录,以避免在构建文档时添加依赖项。

Qt 绑定#

目前有2个活跃支持的Qt版本,Qt5和Qt6,每个版本有两个支持的Python绑定 -- 针对Qt5的 PyQt5PySide2 以及针对Qt6的 PyQt6PySide6 [1]. Matplotlib的qtagg和qtcairo后端(matplotlib.backends.backend_qtaggmatplotlib.backend.backend_qtcairo)支持所有这些绑定,公共部分在 matplotlib.backends.backend_qt 模块中提取。

在运行时,这些后端按以下方式选择实际使用的绑定:

  1. 如果一个绑定的 QtCore 子包已经被导入,那么该绑定将被选中(检查顺序为 PyQt6PySide6PyQt5PySide2)。

  2. 如果 QT_API 环境变量被设置为 "PyQt6"、"PySide6"、"PyQt5"、"PySide2" 中的一个(不区分大小写),则选择该绑定。(另请参阅关于 环境变量 的文档。)

  3. 否则,将按顺序 PyQt6PySide6PyQt5PySide2 选择第一个可用的后端。

过去,Matplotlib 为每个版本的 Qt 使用单独的后端(例如 qt4agg/matplotlib.backends.backend_qt4agg 和 qt5agg/matplotlib.backends.backend_qt5agg)。当添加对 Qt6 的支持时,这种方案被放弃了。为了向后兼容,qt5agg/backend_qt5agg 和 qt5cairo/backend_qt5cairo 仍然可用;选择这些后端会强制使用 Qt5 绑定。不鼓励使用它们,而应优先使用 backend_qtaggbackend_qtcairo。然而,这些模块在我们放弃对 Qt5 的支持之前不会被弃用。

虽然 PyQt 和 Qt for Python(又名 PySide)都紧密反映了它们所封装的底层 C++ API,但它们并不是彼此的直接替代品 [2]。为了应对这种情况,Matplotlib 在 matplotlib.backends.qt_compat 中有一个内部 API 兼容层,涵盖了我们的需求。尽管这是一个公共模块,我们并不认为它是一个稳定的面向用户的 API,它可能会在没有警告的情况下发生变化 [3]