QMdiArea как отрисовать каждое окно
Мне нужно нарисовать в каждом субокне линейный график на основе массива "mas".
Попробовал в одном нарисовать выскакивают еще дополнительные окна (уже решил эту проблему).
P.S. Добавил self.show(), после чего перестали выскакивать ненужные окна.
Теперь пробовал через цикл рисовать каждое подокно перебирая self.area[i],
зависает все.
from PyQt5.QtWidgets import QApplication, QMainWindow, QMdiArea, QMdiSubWindow
from PyQt5 import QtCore, QtGui, QtWidgets, QtChart
mas =[1.33, 1.15, 1.55, 1.65, 1.64, 1.91, 1.33, 2.3, 1.5, 1.35, 2.52, 1.77, 1.7, 1.87, 2.0, 1.55, 1.73, 2.1,
1.33, 1.15, 1.55, 1.92, 1.64, 1.91, 1.33, 1.71, 1.5, 1.35, 1.22, 1.77, 1.7, 1.87, 2.7, 1.55, 1.73, 2.1,
1.33, 1.15, 1.55, 1.92, 1.64, 1.91, 1.33, 1.71, 1.5, 1.35, 1.22, 1.77, 1.7, 1.87, 2.0, 1.55, 1.73, 2.1]
x = len(mas)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.mdi = QMdiArea()
self.setCentralWidget(self.mdi)
for title in ["Data:1", "Data:2", "Data:3", "Data:n"]:
mdiChild = QMdiSubWindow()
mdiChild.setWindowTitle(title)
self.mdi.addSubWindow(mdiChild)
self.mdi.tileSubWindows()
self.setCentralWidget(self.mdi)
self.updateActiveChild(self.mdi.activeSubWindow())
# install signal handlers
self.mdi.subWindowActivated.connect(self.updateActiveChild)
def updateActiveChild(self, subWindow):
print("111111")
self.area = self.mdi.subWindowList()
self._chart_view = QtChart.QChartView()
self.central_widget = QtWidgets.QWidget()
self.area[0].setWidget(self.central_widget)
self.lay = QtWidgets.QVBoxLayout(self.central_widget)
self.lay.addWidget(self._chart_view)
self._chart = QtChart.QChart()
self._line_serie = QtChart.QLineSeries()
for i in range(0, len(mas)):
self._line_serie.append(QtCore.QPointF(i, mas[i]))
self._chart.addSeries(self._line_serie)
self._chart_view.setChart(self._chart)
self.show()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я переписал ваш пример, чтобы он работал правильно:
import random # +++
from PyQt5.QtWidgets import QApplication, QMainWindow, QMdiArea, \
QMdiSubWindow, QWidget, QVBoxLayout
from PyQt5 import QtCore, QtChart
class MainWindow(QMainWindow):
def __init__(self, mas, parent=None):
super().__init__(parent)
self.mas = mas # +++
self.mdi = QMdiArea()
self.mdi.tileSubWindows()
self.setCentralWidget(self.mdi)
for title in ["Data_1", "Data_2", "Data_3", "Data_n"]:
mdiChild = QMdiSubWindow()
mdiChild.setWindowTitle(title)
self.mdi.addSubWindow(mdiChild)
mdiChild.show() # !!!
self.area = self.mdi.subWindowList()
for subWindow in self.area:
self.updateActiveChild(subWindow)
QApplication.processEvents()
def updateActiveChild(self, subWindow):
print(f"subWindow -> {subWindow.windowTitle()}")
_chart_view = QtChart.QChartView() # self не нужен !!!
widget = QWidget() # ...
subWindow.setWidget(widget)
lay = QVBoxLayout(widget)
lay.addWidget(_chart_view)
_chart = QtChart.QChart()
_line_serie = QtChart.QLineSeries()
if subWindow.windowTitle() != "Data_1":
random.shuffle(self.mas)
for i in range(0, len(self.mas)):
_line_serie.append(QtCore.QPointF(i, self.mas[i]))
_chart.addSeries(_line_serie)
_chart_view.setChart(_chart)
mas =[
1.33, 1.15, 1.55, 1.65, 1.64, 1.91, 1.33, 2.3, 1.5, 1.35, 2.52, 1.77,
1.7, 1.87, 2.0, 1.55, 1.73, 2.1, 1.33, 1.15, 1.55, 1.92, 1.64, 1.91,
1.33, 1.71, 1.5, 1.35, 1.22, 1.77, 1.7, 1.87, 2.7, 1.55, 1.73, 2.1,
1.33, 1.15, 1.55, 1.92, 1.64, 1.91, 1.33, 1.71, 1.5, 1.35, 1.22,
1.77, 1.7, 1.87, 2.0, 1.55, 1.73, 2.1
]
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
w = MainWindow(mas) # +++ mas
w.show()
sys.exit(app.exec_())
