Как получить фактические значения x, y по курсору

Рисую перекрестие в классе MainWindow нажатием кнопки gross_. Далее в классе MyFilter обрабатывается движение мыши в фукции eventFilter. В частности в зависимости от положения прокрутки зависит перирисовска перекрестия.

Вообще конечно хочу сделать перерисовку по по курсору, но не пойму, как получить фактические значения по оси x(индексы) и y. Получилось только узнать координаты event.pos(). Вот здесь во втором коде, как должно выглядеть и работать перекрестие.

P.S. Мне удалось перерисовать перекрестие на линии прокрутки, нужно получить значения по оси x, чтобы отрисовать по курсору.

перекрестие пример кода

from PyQt5 import QtCore, 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.parent = parent

    def eventFilter(self, obj, event):
        if event.type() == QtCore.QEvent.HoverMove:
            ymin = np.amin(mas[int(self.parent.min): int(self.parent.max)])
            ymax = np.amax(mas[int(self.parent.min): int(self.parent.max)])
            z = (ymin + ymax) / 2.0
            index = (self.parent.min + self.parent.max + 1) / 2
            chart_view = self.parent.splitter.widget(0)
            if isinstance(chart_view, QtChart.QChartView):
                chart = chart_view.chart()
                s = chart.series()
                pos = event.pos()
                print(pos)
                vectorG = s[1]
                vectorV = s[2]
                vectorG.clear()
                vectorV.clear()

                vectorG.append(QtCore.QPointF(self.parent.min, z))
                vectorG.append(QtCore.QPointF(self.parent.max + 1, z))
                vectorV.append(QtCore.QPointF(index, ymin))
                vectorV.append(QtCore.QPointF(index, ymax))

        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.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))
        vectorG = line_serieG.pointsVector()
        vectorV = line_serieV.pointsVector()
        print("данные при установке", vectorG, vectorV)

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

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