2012-09-02 82 views
0

由於我沒有得到this問題的答案,我試着用PyQt解決它。 顯然,當涉及到QScrollArea時,並不那麼容易......用PyQt和matplotlib在可滾動窗口小部件中顯示幾個圖

我寫了一個小測試,基本上做我在找的東西,但它沒有顯示滾動區域和裏面的情節,因爲我期望:

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

您正在爲每個圖創建一個QWidget。但是您不通過佈局將canvastoolbar放入其中,因此它們無法將尺寸信息與QWidget進行通信。默認情況下,QWidget沒有minimumSize,並且QScrollArea中的小部件/佈局可以使它們儘可能小,以便適合可用空間(大小爲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) 
+0

太棒了!這比我提出的修復要好得多。 –

相關問題