Python PyQt4+;QScrollWidget中的matplotlib

Python PyQt4+;QScrollWidget中的matplotlib,python,matplotlib,pyqt4,pyside,Python,Matplotlib,Pyqt4,Pyside,我将matplotlib嵌入到我正在开发的PyQt4应用程序中。问题是,当我向图形动态添加一个子图时,图形会随着每个添加的子图而压缩。我想我可以通过将图形设置为QScrollArea来解决这个问题,但这不起作用(据我所知)。下面是一个我认为有效的例子 import os os.environ['QT_API'] = 'pyside' from PySide.QtGui import * from PySide.QtCore import * import matplotlib fro

我将
matplotlib
嵌入到我正在开发的
PyQt4
应用程序中。问题是,当我向图形动态添加一个子图时,图形会随着每个添加的子图而压缩。我想我可以通过将图形设置为
QScrollArea
来解决这个问题,但这不起作用(据我所知)。下面是一个我认为有效的例子

import os
os.environ['QT_API'] = 'pyside'

from PySide.QtGui   import *
from PySide.QtCore  import *

import matplotlib

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg
from matplotlib.figure                  import Figure


class Canvas(FigureCanvasQTAgg):

    def __init__(self, parent=None):
        self.figure = Figure()
        super(Canvas, self).__init__(self.figure)

        ax = self.figure.add_subplot(1,1,1)
        ax.plot([1,2,3])
        self.draw()

    def add_subplot(self, data=[]):
        rows = len(self.figure.axes) + 1
        for index, axes in enumerate(self.figure.axes, start=1):
            axes.change_geometry(rows, 1, index)

        ax = self.figure.add_subplot(rows, 1, index+1)
        ax.plot(data)

        self.draw()

class Main(QWidget):

    def __init__(self, parent=None):
        super(Main, self).__init__(parent)

        self.canvas = QScrollArea(self)
        self.canvas.setWidget(Canvas(self))
        self.canvas.setWidgetResizable(True)

        for x in range(5):
            self.canvas.widget().add_subplot()

        layout = QVBoxLayout(self)
        layout.addWidget(self.canvas)


app = QApplication([])
main = Main()
main.show()
app.exec_()
注意到所有的图形是如何在同一可见空间中显示的吗?我不必滚动查看其他图表。我不知道该怎么做


有人知道如何做这件事或其他方法吗?

两个步骤可以勾勒出解决这个问题的想法:

取消调整ScollArea的大小以显示滚动条。更改行:

self.canvas.setWidgetResizable(True)

然后在添加子地块时更改地物高度,因为画布将通过检查地物的大小来确定其高度:

def add_subplot(self, data=[]):
    rows = len(self.figure.axes) + 1
    for index, axes in enumerate(self.figure.axes, start=1):
        axes.change_geometry(rows, 1, index)

    ax = self.figure.add_subplot(rows, 1, index+1)
    ax.plot(data)
    self.figure.set_figheight(self.figure.get_figheight()*1.25)
    self.draw()
总之,您必须让PySide知道,它必须在滚动区域调整小部件的大小:

    for x in range(5):
        self.canvas.widget().add_subplot()
        self.canvas.widget().adjustSize()
    for x in range(5):
        self.canvas.widget().add_subplot()
        self.canvas.widget().adjustSize()