0

我是 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 知道答案,请告诉我。谢谢。

4

1 回答 1

0

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

所以你需要:

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

您的 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 轴的方式。我希望这可以帮助你。此致

于 2014-06-25T11:20:53.373 回答