首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么单击QLineSeries的信号返回的点不在QLineSeries.point()中?

为什么单击QLineSeries的信号返回的点不在QLineSeries.point()中?
EN

Stack Overflow用户
提问于 2020-04-02 11:36:13
回答 1查看 371关注 0票数 0

我使用的是pyqt5和pyside2,而不是c++ qt。

我试过这个:

代码语言:javascript
复制
series = QLineSeries()
series.append(QPointF(x, y))
series.clicked.connect(lambda p: print(p in series.point()))

实际上,每次我单击这个点时,返回的点并不是串联的(False),而是根据qt5文档

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

据我所知,图表中的点也应该在系列中。

那么,我怎样才能通过点击得到一个连续点呢?

EN

回答 1

Stack Overflow用户

发布于 2020-04-02 16:27:51

解释:

为了理解QLineSeries单击信号的功能,我将使用以下示例:我将使用点(0,0),(1,1),(2,0),(3,1)和(4,0)来构造这个系列。

如果您查看信号,它将在连接构建序列的点的线路按下(例如(2.5,0.5))时发出,因此按下的点与points() (或pointsVector())返回的不一致。

解决方案:

如果只希望在按下用于构建序列的点时检测,则可以计算距离以检查其是否小于阈值,然后返回该点:

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60990641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档