如何在PyQt的QGraphicsScene中通过拖拽拐角调整多边形大小
要实现拖拽多边形拐角调整形状大小的功能,你需要自定义可编辑的多边形项,为每个顶点添加可拖拽的调整手柄即可,具体实现如下:
第一步:新增自定义可编辑多边形类
class EditablePolygonItem(QGraphicsPolygonItem): def __init__(self, polygon, parent=None): super().__init__(polygon, parent) self.setFlag(QGraphicsItem.ItemIsMovable, True) self.setFlag(QGraphicsItem.ItemSendsGeometryChanges, True) self.handles = [] # 手柄大小可自行调整 self.handle_size = 4 # 初始化顶点手柄 self.init_handles() def init_handles(self): # 清空旧手柄 for handle in self.handles: if self.scene(): self.scene().removeItem(handle) self.handles.clear() # 遍历所有顶点创建手柄 for i, point in enumerate(self.polygon()): handle = QGraphicsRectItem( point.x() - self.handle_size/2, point.y() - self.handle_size/2, self.handle_size, self.handle_size, self ) # 手柄设置为红色,方便识别 handle.setBrush(QtGui.QBrush(QtGui.QColor(255, 0, 0))) handle.setFlag(QGraphicsItem.ItemIsMovable, True) handle.setFlag(QGraphicsItem.ItemSendsGeometryChanges, True) # 存储手柄对应的顶点索引 handle.setData(0, i) self.handles.append(handle) def itemChange(self, change, value): # 手柄移动时同步更新多边形对应顶点 if change == QGraphicsItem.ItemChildPositionChange: child = self.sender() if child in self.handles: idx = child.data(0) new_point = value poly = self.polygon() poly.replace(idx, new_point) self.setPolygon(poly) return super().itemChange(change, value)
第二步:修改原有create_polygon方法
将原来创建QGraphicsPolygonItem的逻辑替换为自定义的可编辑多边形类即可:
def create_polygon(self): # Remove ellipses drawn_points = self.scene.items() for i in drawn_points: self.scene.removeItem(i) # 替换为自定义可编辑多边形 polygon = EditablePolygonItem(QtGui.QPolygonF(self.point_list)) self.scene.addItem(polygon) self.record_points = False self.point_list.clear()
修改完成后生成的多边形每个顶点都会显示红色小方块手柄,直接拖拽手柄即可调整对应拐角的位置,原有整体拖拽移动多边形的功能也可正常使用。
内容的提问来源于stack exchange,提问作者jon_bovi
相关产品推荐
相关产品推荐

