【问题标题】:Show several plots in a scrollable widget with PyQt and matplotlib使用 PyQt 和 matplotlib 在可滚动的小部件中显示多个绘图
【发布时间】:2012-08-27 10:14:45
【问题描述】:

由于我没有得到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_()) 

谁能解释为什么它不起作用?

【问题讨论】:

    标签: python qt matplotlib pyqt qscrollarea


    【解决方案1】:

    您正在为每个地块创建一个QWidget。但是您不会通过布局将canvastoolbar 放入其中,因此它们无法与QWidget 交流尺寸信息。默认情况下,QWidget 没有minimumSizeQScrollArea 内的小部件/布局可以使它们尽可能小以适应可用空间(即QScrollArea 的大小)。

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

    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)
    

    【讨论】:

    • 太棒了!这比我想出的修复要好得多。
    猜你喜欢
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2015-01-15
    • 2016-11-06
    • 2016-07-05
    • 2015-07-07
    • 1970-01-01
    相关资源
    最近更新 更多