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

时间:2012-09-02 09:45:13

标签: python qt matplotlib pyqt qscrollarea

由于我没有得到this问题的答案,我尝试用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_()) 

有谁可以解释为什么它不起作用?

1 个答案:

答案 0 :(得分:4)

您正在为每个情节创建QWidget。但是,您不会通过布局将canvastoolbar放入其中,因此他们无法使用QWidget传达尺寸信息。默认情况下,QWidget没有minimumSizeQScrollArea内的小部件/布局可以使它们尽可能小,以便适合可用空间(大小为{ {1}})。

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

minimumSize