2013-02-05 3 views
1

내가 작업중인 PyQt4 앱에 matplotlib이 삽입되어 있습니다. 문제는 동적으로 그림에 하위 그림을 추가 할 때 그림이 모든 추가 된 하위 그림으로 압축 될 때입니다. 나는이 그림을 QScrollArea으로 설정하여이 문제를 해결할 수 있다고 생각했지만, 그것이 작동하지 않는다 (내가 말할 수있는 한). 다음은 내가 생각했던 것의 예다.QScrollWidget의 PyQt4 + matplotlib

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의 크기 조정 :

답변

2

두 단계는이 문제를 해결하기 위해 아이디어를 스케치합니다. 부가 적 줄거리는 그림의 높이를 변경 추가 할 때 캔버스 그림의 크기를 확인하여 그 높이의 결정 때문에, 그리고

self.canvas.setWidgetResizable(True) 

self.canvas.setWidgetResizable(False) 

에 :

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()