如何将一个绘图直接嵌入到Window中(python; QT;)

时间:2016-01-05 21:02:52

标签: python qt matplotlib qmainwindow

我想将Matplotlib图直接嵌入到窗口QMainWindow中。 它应该是我的程序的一部分,具有更复杂的GUI。 ;)

我找到的唯一方法是将图形添加到QTabWidget中。 请参阅下面的示例代码 我失去了启动我的网页链接。

有没有办法像其他元素(按钮,文本字段,文本区域......)一样直接将图形嵌入窗口?

import sys
from PyQt4.QtGui import QApplication, QMainWindow, QDockWidget, QVBoxLayout,QTabWidget, QWidget
from matplotlib import pyplot
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg

a = QApplication(sys.argv)
w = QMainWindow()
t = QTabWidget(w)
Tab1 = QWidget()
t.addTab(Tab1, '1st Plot')
t.resize(1280, 300)

x = [1, 2, 3]
Fig1 = pyplot.Figure();
Plot =  Fig1.add_subplot(111);
Plot.plot(x)
Plot.grid();

layout = QVBoxLayout();
layout.addWidget(FigureCanvasQTAgg(Fig1));
Tab1.setLayout(layout);

w.showMaximized()
sys.exit(a.exec_())

非常感谢你。

2 个答案:

答案 0 :(得分:0)

FigureCanvasQtAgg与你提到的任何其他控件一样只是QWidget。它的主要区别在于它不允许你在构造函数中传递父类,就像你写的那样

t = QTabWidget(w)

您可以通过调用setParent

FigureCanvasQtAgg达到相同的效果
canvas = FigureCanvasQtAgg(Fig1)
canvas.setParent(w)

您还可以使用QMainWindow的{​​{3}}方法将matplotlib FigureCanvas直接添加到主窗口。但是,如果你想要一个更复杂的gui与其他控件,我不会发现你当前的方法有任何实际问题。

最后,在嵌入matplotlib时,您不应该使用pyplot。坚持面向对象的API。看看setCentralWidget

答案 1 :(得分:0)

这就是我用于PySide的内容。 FigureCanvasQTAgg是一个qt小部件,因此您不需要PlotWidget类。我发现它很有用,因为它为我创造了这个数字。它还使其对其他项目有用,因为您不必处理导入正确的matplotlib对象。从PlotWidget中只需调用轴即可满足您的所有绘图需求。

from PySide import QtGui

import matplotlib
matplotlib.use("Qt4Agg")
matplotlib.rcParams["backend.qt4"] = "PySide"

from matplotlib.figure import Figure
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar

class PlotWidget(FigureCanvas):
    '''Plotting widget that can be embedded in a PySide GUI.'''
    def __init__(self, figure=None):
        if figure is None:
            figure = Figure(tight_layout=True)
        super().__init__(figure)

        self.axes = self.figure.add_subplot(111)

        self.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
# end class

if __name__ == "__main__":
    import sys

    a = QtGui.QApplication(sys.argv)

    w = QtGui.QMainWindow()
    w.show()

    p = PlotWidget()
    p.axes.plot([])

    nav = NavigationToolbar(p, w)
    w.addToolBar(nav)

    w.setCentralWidget(p)

    # or
    # container = QtGui.QWidget()
    # layout = QtGui.QHBoxLayout()
    # container.setLayout(layout)
    # w.setCentralWidget(container)
    # layout.addWidget(p)

    sys.exit(a.exec_())