Как сделать так, чтобы получаемый график вписывался в размер 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_())

