You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:48:05