首页 > 解决方案 > 为什么QLineSeries的点击信号返回的点不在QLineSeries.point()中?

问题描述

我正在使用 pyqt5 和 pyside2,但不是 c++ qt。

我试过这个:

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

其实每次点击点,返回的点不是串联的(False),而是根据qt5文档

当用户通过单击图表中的点触发鼠标事件时,会发出此信号。

据我了解,图表中的点也应该在系列中。

那么我怎样才能通过点击获得一个点呢?

标签: pythonpyqt5pyside2qtcharts

解决方案


解释:

要了解 QLineSeries 点击信号的功能是什么,我将使用以下示例:我将使用点 (0, 0)、(1, 1)、(2, 0)、(3, 1) 构建系列和 (4, 0)。

如果您查看信号,它将在连接构建系列的点的线被按下时发出(例如 (2.5, 0.5)),因此按下的点与points()(or 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()

推荐阅读