2013-07-29 40 views
3

我正在創建一個簡單的PySide應用程序,它也使用MatPlotLib。然而,當我添加了圖形劃分成QFrame,這個數字不會自動適配到框架:如何自動適合PySide QFrame中的Matplotlib圖形?

Plot that doesn't auto stretch

我的圖是使用下面的代碼創建:

class GraphView(gui.QWidget): 
    def __init__(self, name, title, graphTitle, parent = None): 
     super(GraphView, self).__init__(parent) 

     self.name = name 
     self.graphTitle = graphTitle 

     self.dpi = 100 
     self.fig = Figure((5.0, 3.0), dpi = self.dpi, facecolor = (1,1,1), edgecolor = (0,0,0)) 
     self.axes = self.fig.add_subplot(111) 
     self.canvas = FigureCanvas(self.fig) 

     self.Title = gui.QLabel(self) 
     self.Title.setText(title) 

     self.layout = gui.QVBoxLayout() 
     self.layout.addStretch(1) 
     self.layout.addWidget(self.Title) 
     self.layout.addWidget(self.canvas) 
     self.setLayout(self.layout) 

    def UpdateGraph(self, data, title = None): 
     self.axes.clear() 
     self.axes.plot(data) 
     if title != None: 
      self.axes.set_title(title) 

     self.canvas.draw() 

,並且已添加這樣的主要Widget:

# Create individual Widget/Frame (fftFrame) 
     fftFrame = gui.QFrame(self) 
     fftFrame.setFrameShape(gui.QFrame.StyledPanel) 
     self.FFTGraph = GraphView('fftFrame', 'FFT Transform:', 'FFT Transform of Signal', fftFrame) 

回答

5

這是一個工作代碼示例,顯示如何使其工作。我首先想到這是因爲你添加到佈局的延伸,它會佔用其他小部件周圍的額外空間。但是當我刪除它時,它仍然不會調整大小。 '簡單'的解決方案是添加一個resizeEvent,它允許您定義GraphView小部件的大小。在這種情況下,我只是將其幾何設置爲QFrame的幾何體,儘管您可能需要添加一些填充並確保爲QFrame設置了合理的最小尺寸。

from PySide import QtGui 
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 
from matplotlib.figure import Figure 
import sys 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     self.fft_frame = FftFrame(self) 

     self.layout = QtGui.QVBoxLayout() 
     self.layout.addWidget(self.fft_frame) 
     self.setLayout(self.layout) 
     self.setCentralWidget(self.fft_frame) 

class FftFrame(QtGui.QFrame): 
    def __init__(self, parent=None): 
     super(FftFrame, self).__init__(parent) 
     self.setFrameShape(QtGui.QFrame.StyledPanel) 
     self.parent = parent 
     self.graph_view = GraphView('fftFrame', 'FFT Transform:', 'FFT Transform of Signal', self) 

    def resizeEvent(self, event): 
     self.graph_view.setGeometry(self.rect()) 


class GraphView(QtGui.QWidget): 
    def __init__(self, name, title, graph_title, parent = None): 
     super(GraphView, self).__init__(parent) 

     self.name = name 
     self.graph_title = graph_title 

     self.dpi = 100 
     self.fig = Figure((5.0, 3.0), dpi = self.dpi, facecolor = (1,1,1), edgecolor = (0,0,0)) 
     self.axes = self.fig.add_subplot(111) 
     self.canvas = FigureCanvas(self.fig) 
     self.canvas.setParent(self) 

     self.Title = QtGui.QLabel(self) 
     self.Title.setText(title) 

     self.layout = QtGui.QVBoxLayout() 
     self.layout.addWidget(self.Title) 
     self.layout.addWidget(self.canvas) 
     self.layout.setStretchFactor(self.canvas, 1) 
     self.setLayout(self.layout) 
     self.canvas.show() 

    def update_graph(self, data, title = None): 
     self.axes.clear() 
     self.axes.plot(data) 
     if title != None: 
      self.axes.set_title(title) 

     self.canvas.draw() 


if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    window = MainWindow() 
    window.show() 
    app.exec_() 
+0

我試過將它適配到我的代碼,但它並沒有出現工作。我會繼續嘗試並讓你知道。 – KronoS

+0

您可以將resizeEvent添加到GraphView,但您需要存儲父級,以便您可以在resizeEvent –

+1

期間查詢self.parent.rect()我沒有傳遞父級,因此未正確附加它到父框架。這像一個魅力。 – KronoS