PyQtGraph中如何创建指定中点的可拖拽调整线段?
在PyQtGraph中实现带同步中点的可拖拽线段ROI
直接基于pg.LineSegmentROI扩展,添加中点标记并实现同步更新,以下是完整解决方案:
自定义ROI类
继承原LineSegmentROI,新增中点标记并绑定更新逻辑:
import pyqtgraph as pg from pyqtgraph.Qt import QtWidgets, QtCore class LineSegmentMidPointROI(pg.LineSegmentROI): def __init__(self, pos, **kwargs): super().__init__(pos, **kwargs) # 创建红色圆点作为中点标记 self.mid_point = pg.ScatterPlotItem(size=10, pen=pg.mkPen('r'), brush=pg.mkBrush('r')) # 线段变化时触发中点更新 self.sigRegionChanged.connect(self.update_mid_point) def setParentItem(self, parent): super().setParentItem(parent) # 将中点标记添加到ViewBox中 if parent is not None: parent.addItem(self.mid_point) self.update_mid_point() def update_mid_point(self): # 获取两个端点的全局坐标 p1, p2 = self.getGlobalHandlePositions() # 计算中点坐标 mid_pos = ((p1.x() + p2.x())/2, (p1.y() + p2.y())/2) # 更新中点位置 self.mid_point.setData(pos=[mid_pos]) def updateHandles(self): super().updateHandles() # 端点位置更新时同步更新中点 self.update_mid_point()
使用示例
创建包含该ROI的可视化窗口,测试拖拽、缩放功能:
if __name__ == '__main__': app = QtWidgets.QApplication([]) win = pg.GraphicsLayoutWidget(show=True, title="带中点的线段ROI") view = win.addViewBox() view.setAspectLocked(True) # 初始化线段,端点为(0,0)和(10,10) line_roi = LineSegmentMidPointROI([[0, 0], [10, 10]], pen=pg.mkPen('b', width=2)) view.addItem(line_roi) # 添加坐标轴 ax = pg.AxisItem(orientation='bottom') ay = pg.AxisItem(orientation='left') win.addItem(ax, row=1, col=0) win.addItem(ay, row=0, col=1) view.setXLink(ax) view.setYLink(ay) ax.setLabel('X轴') ay.setLabel('Y轴') app.exec_()
关键逻辑说明
- 保留
LineSegmentROI原有所有交互功能(拖拽端点调整长度、整体拖拽移动线段) - 通过
sigRegionChanged信号和重写updateHandles方法,覆盖所有线段变化场景,确保中点实时同步更新 - 中点标记使用
ScatterPlotItem,可根据需求调整颜色、大小等样式
内容的提问来源于stack exchange,提问作者patoghfa
相关产品推荐
相关产品推荐

