如何从图表中获取值?

问题描述

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

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

解决方法

mouse事件将从上方的小部件传播到其下方的小部件,如果其中一个小部件消耗了鼠标事件,则不再发送该事件。在您的情况下,如果鼠标经过图表,则窗口将不会接收到它,因此您必须侦听QChartView的鼠标事件,为此,至少有两个选项:覆盖QChartView的mouseXEvent或使用事件过滤器。在这种情况下,我将使用第二个选项。

另一方面,您必须将相对于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)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...