Как встроить график непосредственно в окно (python; QT;)
Я хочу встроить график Matplotlib прямо в окно, QMainWindow. Это должно быть частью моей программы с более сложным графическим интерфейсом.;)
Единственный способ, который я нашел, - это добавить фигуру в качестве виджета в 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 ответа
Это то, что я использую для 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_())
FigureCanvasQtAgg
это просто QWidget
как и любой другой элемент управления, который вы упомянули. Основное отличие в том, что он не позволяет передавать родительский элемент в конструктор, как при написании
t = QTabWidget(w)
Вы можете добиться того же с FigureCanvasQtAgg
позвонив setParent
canvas = FigureCanvasQtAgg(Fig1)
canvas.setParent(w)
Вы также можете использовать QMainWindow
"s setCentralWidget
способ добавить Matplotlib FigureCanvas
прямо к вашему главному окну. Однако, если вам нужен более сложный графический интерфейс с другими элементами управления, я не вижу никаких реальных проблем с вашим текущим подходом.
Наконец, вы не должны использовать pyplot
при встраивании матплотлиб. Придерживайтесь объектно-ориентированного API. Посмотрите на этот пример.