如何使 matplotlib 工具栏能够停靠在 pyqt5 window 的一侧?

How do I make the matplotlib toolbar able to dock to the side in a pyqt5 window?

我在 pyqt5 window 中嵌入了一个 matplotlib 图和工具栏,这是我的代码:

from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
from PyQt5 import QtWidgets


class PlotWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(PlotWindow, self).__init__(parent=parent)

        self.figure = Figure(tight_layout=True)
        self.canvas = FigureCanvas(self.figure)
        self.setCentralWidget(self.canvas)

        self.toolbar = NavigationToolbar(self.canvas, self)
        self.addToolBar(self.toolbar)


if __name__ == '__main__':
    import sys

    app = QtWidgets.QApplication(sys.argv)

    mw = PlotWindow()
    ax = mw.figure.add_subplot()
    mw.show()

    exit(app.exec_())

这是它的样子:

我可以将工具栏拖到底部并将其固定在那里:

但我无法将它停靠在侧面(左侧或右侧)。

这是你可以用任何其他标准 pyqt5 工具栏做的事情,为什么它不能用 matplotlib 工具栏?我该如何让它发挥作用?

我可以通过更改此行在代码中完成:

# self.addToolBar(self.toolbar)
self.addToolBar(QtCore.Qt.LeftToolBarArea, self.toolbar)

结果是:

这就是我想要的,但是如果我从左侧取消停靠工具栏,我将无法再将它停靠在那里,只能停靠在顶部和底部。

matplotlib提供的QToolBar配置为只允许在顶部拖动,信息如the source code:

self.setAllowedAreas(QtCore.Qt.ToolBarArea(
    _to_int(_enum("QtCore.Qt.ToolBarArea").TopToolBarArea) |
    _to_int(_enum("QtCore.Qt.ToolBarArea").BottomToolBarArea)))

解决方法是建立所有区域:

self.toolbar.setAllowedAreas(QtCore.Qt.ToolBarArea.AllToolBarAreas)