Объяснение:
Чтобы понять, какова функция щелкаемого сигнала QLineSeries, я буду использовать следующий пример: я построю ряд, используя точки (0, 0), (1, 1), (2, 0), (3, 1) и (4, 0).
Если вы посмотрите на сигнал, он будет излучаться при нажатии линии, соединяющей точки, из которых была построена серия ( например (2.5, 0.5)), поэтому нажатые точки не совпадают с тем, что возвращает points()
(или pointsVector()
).
Решение:
Если вы хотите определить только когда Вы нажимаете точки, которые используются для построения ряда, затем вы можете рассчитать расстояние, чтобы проверить, меньше ли оно порогового значения, а затем вернуть точку:
import sys
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtCharts import QtCharts
def verify(series, p, threshold=0.05):
distances = [
(QtGui.QVector2D(p - x).length(), x)
for x in series.pointsVector()
if QtGui.QVector2D(p - x).length() < threshold
]
if distances:
p = min(distances)
return p[1]
def main():
app = QtWidgets.QApplication(sys.argv)
series = QtCharts.QLineSeries()
series << QtCore.QPointF(0, 0) << QtCore.QPointF(1, 1) << QtCore.QPointF(
2, 0
) << QtCore.QPointF(3, 1) << QtCore.QPointF(4, 0)
series.setPointsVisible()
chart = QtCharts.QChart()
chart.addSeries(series)
chart.createDefaultAxes()
chartView = QtCharts.QChartView(chart)
chartView.show()
chartView.resize(640, 480)
def on_clicked(p):
x = verify(series, p)
if x is not None:
print("clicked: ", x)
series.clicked.connect(on_clicked)
sys.exit(app.exec_())
if __name__ == "__main__":
main()