使用Qt选择PlotWidget上的点

时间:2014-06-25 10:19:59

标签: python qt pyside pyqtgraph

我是python / pyside / pyqtgraph的新手,我有点卡在我的程序中。

所以,我有一个代表10000个值的numpy.ndarray,我使用plot方法在PlotWidget中绘制它。 结果还可以,但现在我想让用户选择曲线的点,这样我就可以保存点的X轴并在以后使用它。

我想要做的是创建一个QPushButton,当点击它时,它等待用户通过左键单击选择曲线上的两个点,然后保存X轴。从概念上看似乎很简单,但我找不到这样做的好方法。 如果你能给我一个例子或者其他什么,我会很高兴,我也对任何偏离这个用例的建议持开放态度。

我可以按以下方式恢复代码:

self.myWidget = pyqtgraph.PlotWidget()
self.myWidget.plot(myValues) # myValues is the numpy array
self.select2PointsButton = QtGui.QPushButton()
self.select2PointsButton.clicked.connect(self.waitForSelection)

def waitForSelection(self):
# Wait for a click left on the curve to select first point then save the X-axis
# Do it again to select the second point

谢谢, 摩根

在Zet4回答后编辑:

感谢您的回答,它帮助我开始了。 最后,我创建了PlotWidget的子类:

class PltWidget(pg.PlotWidget):

def __init__(self, parent=None):
    super(PltWidget, self).__init__(parent)
    self.selectionMode = False

def mousePressEvent(self, ev):
    if self.selectionMode:
        if ev.button() == QtCore.Qt.LeftButton:
            # How do I get the X axis ?
    else:
        super(PltWidget, self).mousePressEvent(ev)

然后我在我的窗口中使用它,将按钮信号与插槽连接,改变我的PltWidget的布尔值:

..... # Other attributes and connections of my Window
self.T0Button = QtGui.QPushButton()
self.graphicsLeft = PltWidget()
self.T0Button.clicked.connect(self.selectT0)

def selectT0(self):
    self.graphicsLeft.selectionMode = not(self.graphicsLeft.selectionMode)

我可能会使用您的缓冲区策略来命令用户进行两次选择。 但是,我仍然需要知道如何从我点击的位置获取PlotWidget的X轴。如果有人使用pyqtgraph知道答案,请告诉我。 感谢。

1 个答案:

答案 0 :(得分:0)

我道歉,我不是pyqt专家,但你的问题似乎更具概念性而非技术性。 您可以使用QPushButton.clicked(在您的代码中,waitForSelection函数)来更改对象的功能状态(允许或禁用点选择)。

所以你需要:

  • 创建一个拦截pushButton(您的waitForSelection函数)上的点击的函数
  • 创建一个拦截左键单击图形对象的函数(我假设你将它命名为onLeftClick)
  • 功能状态处理程序:布尔值是最简单的方法(isSelectedMode)。
  • 表示一个点的缓冲区。 (缓冲区在这里,它可以是你所说的X轴)#/ li>

您的waitForSelection函数只会反转isSelectedMode的状态。在您不再需要之前,它还会清除缓冲区。伪代码:

if isSelectedMode == true
    buffer = null;
isSelectedMode = !isSelectedMode;

onLeftClick将完成更多工作,请参阅此伪代码:

if isSelectedMode == true
    if buffer != null // No point save, so this click is the first one
        //Here you save your data in the buffer
    else
        // One point is saved so that's the second one. 
        // Do what you want with it and buffer
else
    // The selection mode is not active.

唯一缺少的是从左键单击获取X轴的方法。 我希望这可以帮到你。 最好的问候