我想将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_())
非常感谢你。
答案 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_())