Python 使用PyQt和matplotlib在可滚动的小部件中显示多个绘图

Python 使用PyQt和matplotlib在可滚动的小部件中显示多个绘图,python,qt,matplotlib,pyqt,qscrollarea,Python,Qt,Matplotlib,Pyqt,Qscrollarea,因为我并没有得到这个问题的答案,所以我试着用PyQt解决它。 很明显,当QScrollArea牵涉其中时,这并不容易 我写了一个小测试,基本上实现了我想要的功能,但它没有像我预期的那样显示滚动区域和其中的绘图: from PyQt4 import QtCore, QtGui import os,sys #import matplotlib from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanv

因为我并没有得到这个问题的答案,所以我试着用PyQt解决它。 很明显,当QScrollArea牵涉其中时,这并不容易

我写了一个小测试,基本上实现了我想要的功能,但它没有像我预期的那样显示滚动区域和其中的绘图:

from PyQt4 import QtCore, QtGui
import os,sys

#import matplotlib
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar
from matplotlib.figure import Figure

qapp = QtGui.QApplication(sys.argv)
qwidget = QtGui.QWidget()
qwidget.setGeometry(QtCore.QRect(0, 0, 500, 500))
qlayout = QtGui.QHBoxLayout(qwidget)
qwidget.setLayout(qlayout)

qscroll = QtGui.QScrollArea(qwidget)
qscroll.setGeometry(QtCore.QRect(0, 0, 500, 500))
qscroll.setFrameStyle(QtGui.QFrame.NoFrame)
qlayout.addWidget(qscroll)

qscrollContents = QtGui.QWidget()
qscrollLayout = QtGui.QVBoxLayout(qscrollContents)
qscrollLayout.setGeometry(QtCore.QRect(0, 0, 1000, 1000))

qscroll.setWidget(qscrollContents)
qscroll.setWidgetResizable(True)

for i in xrange(5):
  qfigWidget = QtGui.QWidget(qscrollContents)
  fig = Figure((5.0, 4.0), dpi=100)
  canvas = FigureCanvas(fig)
  canvas.setParent(qfigWidget)
  toolbar = NavigationToolbar(canvas, qfigWidget)
  axes = fig.add_subplot(111)
  axes.plot([1,2,3,4])
  qscrollLayout.addWidget(qfigWidget)

qscrollContents.setLayout(qscrollLayout)

qwidget.show()
exit(qapp.exec_()) 

有人能解释为什么它不工作吗?

您正在为每个绘图创建一个
QWidget
。但是您没有通过布局将
画布
工具栏
放入其中,因此它们无法与
QWidget
通信大小信息。默认情况下,
QWidget
没有
minimumSize
,而
qscrollara
内部的widget/layout可以使其尽可能小,以适应可用空间(即
qscrollara
的大小)

通过布局添加绘图有帮助,但我发现
FigureCanvas
小部件也没有任何最小尺寸,因此可以缩小。要快速修复问题,您可以设置
最小大小
。具有这些修复程序的循环部分应如下所示:

for i in xrange(5):
  qfigWidget = QtGui.QWidget(qscrollContents)

  fig = Figure((5.0, 4.0), dpi=100)
  canvas = FigureCanvas(fig)
  canvas.setParent(qfigWidget)
  toolbar = NavigationToolbar(canvas, qfigWidget)
  axes = fig.add_subplot(111)
  axes.plot([1,2,3,4])

  # place plot components in a layout
  plotLayout = QtGui.QVBoxLayout()
  plotLayout.addWidget(canvas)
  plotLayout.addWidget(toolbar)
  qfigWidget.setLayout(plotLayout)

  # prevent the canvas to shrink beyond a point
  # original size looks like a good minimum size
  canvas.setMinimumSize(canvas.size())

  qscrollLayout.addWidget(qfigWidget)

令人惊叹的!这比我想出的解决办法好多了。