При передачи переменных в другой класс, передаются неизменные переменные

В классе MainWindow создается событие обработки движения мыши, посредством кнопки gross_ и добавляется перекрестие.

В слидере onAxisSliderMoved обновляются self.min, self.max. При распечатке из другой фунции видно, что они обновляются. Но, когда я получаю их в классе MyFilter они остаются неизменными.

Так же количество серий в MainWindow три, а в MyFilter всего одна серия(выводится в принт)

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()

    def eventFilter(self, obj, event):
        if event.type() == QtCore.QEvent.HoverMove:

            ymin = np.amin(mas[int(self.window.min): int(self.window.max + 1)])
            ymax = np.amax(mas[int(self.window.min): int(self.window.max + 1)])
            z = (ymin + ymax) / 2.0

            chart_view = self.window.splitter.widget(0)
            if isinstance(chart_view, QtChart.QChartView):
                chart = chart_view.chart()
                s = chart.series()

            print("new data", self.window.min, self.window.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.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_())

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

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

Если я вас правильно понял, то вам не надо создавать новый объект self.window = MainWindow() в классе MyFilter.

При создании экземпляра self.filter = MyFilter(self) передайте self, который является объектом экземпляра класса MainWindow. а в классе MyFilter принимаем этот объект self в переменную parent и для того чтобы иметь доступ к атрибутам класса MainWindow во всех методах класса MyFilter (в данном случае eventFilter) мы в конструкторе (__init__) должны сделать self.parent = parent и дальше оперировать с 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_())

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

→ Ссылка