Как встроить график непосредственно в окно (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. Посмотрите на этот пример.

Другие вопросы по тегам