2

この質問に対する答えが得られなかったので、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_()) 

機能しない理由を説明できる人はいますか?

4

1 に答える 1

6

QWidgetfor each プロットを作成しています。ただし、レイアウトを介してcanvasまたはを配置しないため、サイズ情報を. デフォルトでは、 には何もなく、 内のウィジェット/レイアウトは、使用可能なスペース ( のサイズ) に収まるように必要なだけ小さくすることができます。toolbarQWidgetQWidgetminimumSizeQScrollAreaQScrollArea

レイアウトを介してプロットを追加すると役立ちますが、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)
于 2012-09-02T20:52:24.887 に答える