python - 为什么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文档
当用户通过单击图表中的点触发鼠标事件时,会发出此信号。
据我了解,图表中的点也应该在系列中。
那么我怎样才能通过点击获得一个点呢?
解决方案
解释:
要了解 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()
推荐阅读
- c# - 在生成的模型中,什么是虚拟
伴随着 标识外键? - vba - VBA 是否使用全局解释器锁?所有解释语言都需要一个吗?
- r - 什么决定了 rdb R 源数据库的大小
- bash - 当键包含连字符/破折号时,如何使用 Bash 上的 JMESPath 查询按值过滤 Azure CLI 输出?
- arrays - Swift,带有映射/高阶函数的 for 循环表达式
- django - Django 在自定义用户模型上重置 oneToOneField
- excel - 在 Excel for Mac 中使用 VBA 从 Web 搜索中获取完整数据时遇到问题
- python - MDTextField 模式:“矩形”(hint_text 错误)
- javascript - 如何向 Javascript 公开新添加的选择选项
- python - 将每个数组元素与python中的每个列表元素进行比较