情景
Python+PyQt+pyqtgraph读取数据绘图,并在图像上添加了LineSegmentROI带handle的竖线(hanlde是为了RectROI的拖动),现要实现竖线可以直接拖动,并在拖动后恢复到原来的纵方向位置,只改变拖动的横方向位置。
实现
生成竖线
官方文档是这样写的:
LineSegmentROI(positions=(None, None), pos=None, handles=(None, None), **args)
参数什么的就不具体说了,生成一条可移动的直线只需要传入起点终点坐标和movable
参数即可。
import pyqtgraph as pg
# self.bottom和self.top是设置的竖线默认最低点和最高点的纵坐标,x为任意位置
self.line = pg.LineSegmentROI(([x, self.bottom], [x, self.top]), movable=True)
拖拽事件
# 取消handle的拖拽事件
for handle in self.line.getHandles():
handle.mouseDragEvent = self.disable_drag_event()
def disable_drag_event(self, ev):
return
# 重写竖线的拖拽事件
line.mouseDragEvent = new_drag_event()
def new_drag_event(self, ev):
self.line.mouseDragHandler.mouseDragEvent(ev) # 默认事件,需要重新实现
finish = ev.finish # 判断拖拽结束
pos = self.get_mouse_pos() # 获取鼠标当前位置(ev里有关于位置的不对劲)
self.on_line_moving(pos) # 具体实现的方法
拖拽实现
self.line.setPos()存在问题,于是采用移动handle方法
def on_line_moving(self, pos):
self.line.movePoint(self.line.getHadles()[0], [pos, self.bottom], finish=False)
self.line.movePoint(self.line.getHadles()[1], [pos, self.top], finish=True)