0

我在 pyqt5 窗口中嵌入了一个 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)

结果是:

在此处输入图像描述

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

4

1 回答 1

2

matplotlib 提供的 QToolBar 被配置为只允许在顶部拖动和源代码中看到的信息:

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)
于 2021-11-02T23:44:45.963 回答