如何在pyqtgraph中使用sigPointsClicked

时间:2015-01-26 15:22:10

标签: pyqt4 pyqtgraph

我使用pyqtgraph创建了一个带有点的行:

self.gaussianPlot = GraphicsLayoutWidget()
self.gaussianPlot.resize(750, 250)    

energyPlot=self.gaussianPlot.addPlot(row=1, col=1)
energyPlot.plot(self.scfenergies, symbol='o')
energyPlot.sigPointsClicked.connect(self.gausclicked())

我想检测energyPlot上的哪个点已被点击。但是,我收到一个错误:

Traceback (most recent call last):
File "/home/shrx/PycharmProjects/moldy/moldy.py", line 358, in readGaussian
energyPlot.sigPointsClicked.connect(self.gausclicked)
AttributeError: 'PlotItem' object has no attribute 'sigPointsClicked'

如何正确使用sigPointsClicked检测点击了哪个点?

更新

按照@ Luke的回答,这里是我重写代码的方式:

self.energyPlot=self.gaussianPlot.addPlot(row=1, col=1)
self.energyPlotData=self.energyPlot.plot(self.scfenergies, symbol='o')
self.energyPlotData.sigPointsClicked.connect(self.gausclicked)

def gausclicked(self, points):
    print(points)
    print(self.energyPlot.listDataItems())

结果,我得到了:

<pyqtgraph.graphicsItems.PlotDataItem.PlotDataItem object at 0x7f1a18065678>
[<pyqtgraph.graphicsItems.PlotDataItem.PlotDataItem object at 0x7f1a18065678>]

所以没有明显的方法可以检测数据集中的哪个点被点击了?看起来sigPointsClicked会返回整个数据集。

更新2

所需的最后修复是向gausclicked函数添加第二个参数:

def gausclicked(self, item, points):
    print(points)

1 个答案:

答案 0 :(得分:2)

您需要跟踪两个不同的类:

  • PlotItem 包含整个绘图区域,包括轴,视图和其中包含的所有数据。此类型由GraphicsLayoutWidget.addPlot()返回。如错误所示,它没有sigPointsClicked

  • PlotDataItem 负责绘制单个数据集的线条和点。此类有sigPointsClicked信号,并在您致电PlotItem.plot(...)时返回。