Как получить значения из диаграммы?

#python #pyqt #pyqt5 #qtcharts #qchart

#python #pyqt #pyqt5 #qtcharts #qchart

Вопрос:

Легко получить координаты мыши в приложении —

     self.setMouseTracking(True)

def mouseMoveEvent(self, event):
    mouse_x = event.x()
    mouse_y = event.y()
  

Но для чата это вообще не работает. Как получить значения координат в чате при наведении курсора мыши? Код:

 from random import uniform
import sys

from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget
from PyQt5.QtChart import QChart, QChartView, QLineSeries

class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(100, 100, 680, 500)

        series = QLineSeries()
        for i in range(100):
            series.append(i, uniform(0, 10))

        chart = QChart()
        chart.addSeries(series)
        chart.createDefaultAxes()
        chartview = QChartView(chart)

        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        lay = QVBoxLayout(central_widget)
        lay.addWidget(chartview)
        self.setMouseTracking(True)

    def mouseMoveEvent(self, event):
        mouse_x = event.x()
        mouse_y = event.y()

if __name__ == "__main__":
    App = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(App.exec_())
  

Ответ №1:

Событие мыши передается от виджета выше к виджету под ним, если один из этих виджетов использует его, то оно больше не будет передаваться. В вашем случае, если мышь проходит над диаграммой, окно не получит ее, поэтому вы должны прослушать события мыши QChartView, и для этого есть как минимум 2 варианта: переопределить mouseXEvent QChartView или использовать фильтр событий . В этом случае я буду использовать второй вариант.

С другой стороны, вы должны преобразовать позицию относительно QChartView в позиции сцены, а из позиций сцены — в позиции диаграммы.

 class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(100, 100, 680, 500)

        series = QLineSeries()
        for i in range(100):
            series.append(i, uniform(0, 10))

        chart = QChart()
        chart.addSeries(series)
        chart.createDefaultAxes()
        self.chartview = QChartView(chart)

        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        lay = QVBoxLayout(central_widget)
        lay.addWidget(self.chartview)

        self.chartview.setMouseTracking(True)
        self.chartview.viewport().installEventFilter(self)

    def eventFilter(self, obj, event):
        if obj is self.chartview.viewport() and event.type() == QEvent.MouseMove:
            lp = event.pos()
            sp = self.chartview.mapToScene(lp)
            vp = self.chartview.chart().mapToValue(sp)
            print(vp)
        return super().eventFilter(obj, event)
  

Комментарии:

1. Как всегда, отличное решение. Осталось разобраться, как работает фильтр событий.