如何从图表中获取值?
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)
很容易获取鼠标在应用上的坐标-
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)