A
If I understand you correctly, you don't need to create a new object. self.window = MainWindow() in class MyFilter♪When creating a copy self.filter = MyFilter(self) Tell me. self♪
which is the object of a Class MainWindow♪
a in class MyFilter accept this object. self variables parentaccess to class attributes MainWindowin all classes MyFilter (in this case) eventFilter)
We're in the designer.__init__) should be done self.parent = parentand continue operating with self.parent♪from PyQt5 import QtCore, QtGui, QtWidgets, QtChart
import math
import numpy as np
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)
x_ = x - 1
class MyFilter(QtCore.QObject):
def init(self, parent=None):
QtCore.QObject.init(self, parent)
#? self.window = MainWindow() # ---
self.parent = parent # +++
def eventFilter(self, obj, event):
if event.type() == QtCore.QEvent.HoverMove:
ymin = np.amin(mas[int(self.window.min): int(self.window.max + 1)]) # ---
ymin = np.amin(mas[int(self.parent.min): int(self.parent.max + 1)]) # +++ self.parent
ymax = np.amax(mas[int(self.parent.min): int(self.parent.max + 1)]) # ...
z = (ymin + ymax) / 2.0
chart_view = self.parent.splitter.widget(0)
if isinstance(chart_view, QtChart.QChartView):
chart = chart_view.chart()
s = chart.series()
print("new data", self.parent.min, self.parent.max, "количество серий из класса eventFilter", len(s))
return False
class MainWindow(QtWidgets.QMainWindow):
def init(self, start = 1, parent=None):
self.start = start
super().init(parent)
self.setMouseTracking(True)
self.step = 30
self.scrollbar = QtWidgets.QScrollBar(
QtCore.Qt.Horizontal,
sliderMoved=self.onAxisSliderMoved,
pageStep=self.step,
)
self.scrollbar.setRange(0, x_)
central_widget = QtWidgets.QWidget()
self.setCentralWidget(central_widget)
self.gross = QtWidgets.QPushButton()
self.gross.setText("Gross")
self.gross.clicked.connect(self.gross_)
self.delete = QtWidgets.QPushButton()
self.delete.setText("Delete")
self.delete.clicked.connect(self.delete_)
self.hbox = QtWidgets.QHBoxLayout()
self.hbox.addWidget(self.gross)
self.hbox.addWidget(self.delete)
self.splitter = QtWidgets.QSplitter(QtCore.Qt.Vertical)
self.lay = QtWidgets.QVBoxLayout(central_widget)
self.lay.insertLayout(0, self.hbox)
self.lay.addWidget(self.splitter, stretch=1)
self.lay.addWidget(self.scrollbar)
self.chart_view = QtChart.QChartView()
self.chart = QtChart.QChart()
self.line_serie = QtChart.QLineSeries()
for i, value in enumerate(mas):
self.line_serie.append(QtCore.QPointF(i, value))
self.chart.addSeries(self.line_serie)
self.chart.createDefaultAxes()
self.chart_view.setChart(self.chart)
self.splitter.addWidget(self.chart_view)
self.min = 1
self.max = 31
self.adjust_axes(self.min, self.max)
self.index_value = 1
def gross_(self):
self.filter = MyFilter(self) # +++ self
self.installEventFilter(self.filter)
chart_view = self.splitter.widget(0)
chart = chart_view.chart()
line_serieG = QtChart.QLineSeries()
line_serieV = QtChart.QLineSeries()
ymin = np.amin(mas[int(self.min): int(self.max + 1)])
ymax = np.amax(mas[int(self.min): int(self.max + 1)])
z = (ymin + ymax) / 2.0
index = (self.min + self.max + 1) / 2
line_serieG.append(QtCore.QPointF(self.min, z))
line_serieG.append(QtCore.QPointF(self.max + 1, z))
line_serieV.append(QtCore.QPointF(index, ymin))
line_serieV.append(QtCore.QPointF(index, ymax))
chart.addSeries(line_serieG)
chart.addSeries(line_serieV)
chart.createDefaultAxes()
chart_view.setChart(chart)
self.splitter.addWidget(chart_view)
def delete_(self):
self.removeEventFilter(self.filter)
chart_view = self.splitter.widget(0)
if isinstance(chart_view, QtChart.QChartView):
chart = chart_view.chart()
s = chart.series()
for i in range(1, len(s)):
s[i].clear()
self.update()
def adjust_axes(self, value_min, value_max):
for i in range(self.splitter.count()):
chart_view = self.splitter.widget(i)
if isinstance(chart_view, QtChart.QChartView):
chart = chart_view.chart()
s = chart.series()
print("update data", self.min, self.max, "количество серий из класса MainWindow", len(s))
for serie in chart.series():
chart.axisX(serie).setRange(value_min, value_max)
@QtCore.pyqtSlot(int)
def onAxisSliderMoved(self, value):
self.index_value = value
value2 = value + self.step
value1 = value
if value2 >= x_:
value2 = x_
value1 = value2 - self.step
self.min = value1
self.max = value2
self.adjust_axes(math.floor(value1), math.ceil(value2))
if name == "main":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow(start = 0)
w.show()
sys.exit(app.exec_())