如何注册坐标并画一条线?

时间:2018-01-22 19:44:45

标签: python pyqt mouseevent pyqtgraph

使用pyqt我设置了一个ViewBox小部件,在该小部件内部,我需要记录两次鼠标点击以使用连接点击的pyqtgraph roi绘制一条线。

这是我的基本代码,注释我希望它做什么:

def onClick(ev):
    #First mouse click - ONLY register coordinates
    #Second mouse click - register coordinates of second click
    #Draw line connecting the two clicks
w.scene().sigMouseClicked.connect(onClick)

此代码用于返回鼠标点击并绘制一条线,但我不知道如何让它等待第二次鼠标点击:

def onClick(ev):  
    x = ev.pos().x()
    y = ev.pos().y()
    print(x,y)
    line = pg.LineSegmentROI([[711,265], [295, 170]], pen=(4,9)) 
    vb.addItem(line)
w.scene().sigMouseClicked.connect(onClick)

1 个答案:

答案 0 :(得分:1)

这主要是未经测试的代码,但应该让你到达目的地。基本上,您有一个全局数组,其中包含一组或两组坐标。如果在调用处理程序时数组为空,则表示您正在处理第一次单击,并存储这些坐标。如果数组已经包含一组坐标,那么你正在处理第二次点击,你可以绘制你的线,但不要忘记清空数组,这样如果你第三次点击它就能再次工作

clicks = []
def onClick(ev):
    global clicks
    x = ev.pos().x()
    y = ev.pos().y()
    if len(clicks)==0:  # First mouse click - ONLY register coordinates
        print("First click!")
        clicks.append((x,y))
    elif len(clicks)==1:  # Second mouse click - register coordinates of second click
        print("Second click...")
        clicks.append((x,y))

        # Draw line connecting the two clicks
        print("...drawing line")
        line = pg.LineSegmentROI(clicks, pen=(4,9)) 
        vb.addItem(line)

        # reset clicks array
        clicks[:] = [] # this resets the *content* of clicks without changing the object itself
    else:  # something went wrong, just reset clicks
        clicks[:] = []