3

MatPlotLib も使用する単純な PySide アプリケーションを作成しています。ただし、図を に追加するQFrameと、図は自動的にフレームに収まりません。

自動伸縮しないプロット

私のグラフは、次のコードを使用して作成されます。

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

そして、次のようにメイン ウィジェットに追加されます。

# 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)
4

1 に答える 1

5

これを機能させる方法を示す実際のコード サンプルを次に示します。最初は、レイアウトに追加したストレッチが原因だと思っていました。これにより、他のウィジェットの周りの追加スペースが使い果たされます。しかし、それを削除しても、サイズが変更されません。「簡単な」解決策は、GraphView ウィジェットのサイズを定義できる resizeEvent を追加することです。この場合、ジオメトリを 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_()
于 2013-07-29T20:04:02.290 に答える