Почему точка, возвращаемая сигналом щелчка QLineSeries, не находится в QLineSeries.point ()? - PullRequest
0 голосов
/ 02 апреля 2020

Я использую pyqt5 и pyside2, но не c ++ qt.

Я пробовал это:

series = QLineSeries()
series.append(QPointF(x, y))
series.clicked.connect(lambda p: print(p in series.point()))

На самом деле каждый раз, когда я нажимаю на точку, возвращаемая точка не в серии (Неверно), но согласно документу qt5

Этот сигнал испускается, когда пользователь запускает событие мыши, щелкая по точке на графике.

Насколько я понимаю точка на графике также должна быть в серии.

Итак, как я могу получить точку в серии, щелкнув?

1 Ответ

1 голос
/ 02 апреля 2020

Объяснение:

Чтобы понять, какова функция щелкаемого сигнала 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()
...