【问题标题】:Embedding the matplotlib toolbar in pyqt4 using matplotlib custom widget使用 matplotlib 自定义小部件在 pyqt4 中嵌入 matplotlib 工具栏
【发布时间】:2026-02-20 16:20:05
【问题描述】:

我一直在关注这个chapter 将 matplotlib 图嵌入到 QTdesigner 生成的 GUI 中。到目前为止它可以工作,但我还需要在 GUI 中嵌入工具栏来操作绘图并保存它。如何修改示例代码以添加工具栏?我搜索了许多资源,它们都有自己的自定义代码,这些代码不适用于书中给出的示例。

我认为我需要修改自定义小部件类。小部件类的代码在这里:

原始代码(来自书中):

from PyQt4 import QtGui
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas

from matplotlib.figure import Figure

class MplCanvas(FigureCanvas):
    def __init__(self):
        self.fig = Figure()       
        self.ax = self.fig.add_subplot(111)
        FigureCanvas.__init__(self, self.fig)
        FigureCanvas.setSizePolicy(self,
        QtGui.QSizePolicy.Expanding,
        QtGui.QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

class MplWidget(QtGui.QWidget):
    def __init__(self, parent = None):
        QtGui.QWidget.__init__(self, parent)
        self.canvas = MplCanvas()      
        self.vbl = QtGui.QVBoxLayout()
        self.vbl.addWidget(self.canvas)     
        self.setLayout(self.vbl)

我的问题是如何添加代码以使工具栏与画布一起显示?

我知道我必须使用以下方法导入 api:

from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar

我需要创建一个新的类和/或自定义小部件来放入它吗?

【问题讨论】:

  • 好的,经过更多的摆弄和查看link,我将 MplWidget 类修改为:class MplWidget(QtGui.QWidget): def __init__(self, parent = None): QtGui.QWidget.__init__(self, parent) self.canvas = MplCanvas() self.mpl_toolbar = NavigationToolbar(self.canvas, self) self.vbl = QtGui.QVBoxLayout() self.vbl.addWidget(self.canvas) self.vbl.addWidget(self.mpl_toolbar) self.setLayout(self.vbl) 现在它可以工作了。谢谢!
  • 请将该评论作为答案发布并接受。

标签: python qt matplotlib pyqt


【解决方案1】:

好的,经过更多的摆弄和查看link,我将MplWidget类修改为:

class MplWidget(QtGui.QWidget):
     def __init__(self, parent = None):
        QtGui.QWidget.__init__(self, parent)
        self.canvas = MplCanvas()
        self.mpl_toolbar = NavigationToolbar(self.canvas, self)
        self.vbl = QtGui.QVBoxLayout()
        self.vbl.addWidget(self.canvas)
        self.vbl.addWidget(self.mpl_toolbar)
        self.setLayout(self.vbl)

现在它可以工作了。谢谢!

【讨论】:

    最近更新 更多