#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. Как всегда, отличное решение. Осталось разобраться, как работает фильтр событий.