如何从图表中获取值?

How to get values from a chart?

很容易获取鼠标在应用上的坐标-

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

鼠标事件从上面的小部件传播到它下面的小部件,如果其中一个小部件使用它,则它将不再传输。在您的情况下,如果鼠标经过图表,那么 window 将不会接收到它,因此您必须监听 QChartView 的鼠标事件,为此至少有 2 个选项:覆盖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)