Как сделать так, чтобы получаемый график вписывался в размер QGraphicsView и очищался при нажатии кнопки?

Как сделать так, чтобы выводимый график вписывался в размеры виджета, в который он выводится?
Пока что график выводится в QGraphicsView, но он игнорирует размер виджета и не вписывается в его размер?

Также, как можно реализовать очистку QGraphicsView через нажатие кнопки, пытался clear(), но потерпел неудачу.

main.py:

import sys
import random
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
from Ui_unt import Ui_MainWindow
from PyQt5 import QtCore, QtGui, QtWidgets


class TEST(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(TEST, self).__init__()

        self.setupUi(self)
        self.pushButton.clicked.connect(self.graph)
        self.pushButton_2.clicked.connect(self.clear)

    def graph(self):
        self.scene = QtWidgets.QGraphicsScene()
        self.graphicsView.setScene(self.scene)
     #   self.scene.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)

        self.figure = Figure()
        self.axes = self.figure.gca()

        x = [random.randrange(1, 100) for _ in range(10)]
        y = [random.randrange(1, 100) for _ in range(10)]

        self.axes.clear()
        self.axes.plot(x, y)

        self.canvas = FigureCanvas(self.figure)
        self.proxy_widget = self.scene.addWidget(self.canvas)

    def clear(self):

        self.graphicsView.clear()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ui = TEST()
    ui.show()
    sys.exit(app.exec_())

Ui_unt.py:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(249, 332)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.verticalLayout.addWidget(self.pushButton_2)
        self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
        self.graphicsView.setObjectName("graphicsView")
        self.verticalLayout.addWidget(self.graphicsView)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 249, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))
        self.pushButton_2.setText(_translate("MainWindow", "PushButton"))

Ответы (1 шт):

Автор решения: S. Nick

Обратите внимание я убрал QGraphicsView и демонстрирую вам один из наиболее распространенных способов.

import sys
import random

from PyQt5 import QtCore, QtGui, QtWidgets

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar   # +++
from matplotlib.figure import Figure


#from Ui_unt import Ui_MainWindow
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(249, 332)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.verticalLayout.addWidget(self.pushButton_2)
        
#        self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
#        self.graphicsView.setObjectName("graphicsView")
#        self.verticalLayout.addWidget(self.graphicsView)

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 249, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        
#        self.statusbar = QtWidgets.QStatusBar(MainWindow)
#        self.statusbar.setObjectName("statusbar")
#        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "Обновить график"))
        self.pushButton_2.setText(_translate("MainWindow", "Clear"))


class MplCanvas(FigureCanvas):
    def __init__(self, *args, **kwargs):
        self.fig = Figure()
        super(MplCanvas, self).__init__(self.fig, *args, **kwargs)

    def plot(self, x, y):
        self.fig.clear()                                               
        self.ax = self.fig.add_subplot(111)                            
        self.ax.plot(x, y)
        self.draw()  

    def _clear(self):        
        self.fig.clear() 
        self.draw()
        

class TEST(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(TEST, self).__init__()
        self.setupUi(self)
        
        self.pushButton.clicked.connect(self._plot)
        self.pushButton_2.clicked.connect(self.button_clear)
        
        self.canavas = MplCanvas()                                        # !!! canavas
        self.canavas.setMinimumSize(300, 300)
        self.toolbar = NavigationToolbar(self.canavas, self)
        
        self.verticalLayout.addWidget(self.canavas)
        self.verticalLayout.addWidget(self.toolbar)                       # !!!
        self.toolbar.hide()        

    def _plot(self):
        x = [random.randrange(1, 100) for _ in range(10)]
        y = [random.randrange(1, 100) for _ in range(10)]        
        self.canavas.plot(x, y)
        self.toolbar.show()  

    def button_clear(self):
        self.canavas._clear()
        

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ui = TEST()
    ui.show()
    sys.exit(app.exec_())

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка