问题描述
很容易在应用程序上获取鼠标的坐标-
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)