在QGraphicScen中创建具有可移动节点的闭合路径

2024-04-26 11:53:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从this answer扩展这个伟大的实现,这样用户在图形场景中的点击就可以创建路径,并通过双击关闭路径。在

这很好,但我唯一不能解决的问题是路径中第一个节点的更改。显然,我希望它通过itemChanged方法更新附加到它的最后一个子路径,但无法实现。在

关于如何处理这个问题有什么建议吗?在

我尝试了以下变体,但它不影响最后一个子路径:

def itemChange(self, change, value):
    if change == QGraphicsItem.ItemPositionChange:
        self.path.updateElement(self.index, value.toPoint())
        if self.index == 0:
            last_element_idx = self.path.path.elementCount()
            self.path.updateElement(last_element_idx, value.toPoint())
    return QGraphicsEllipseItem.itemChange(self, change, value)

我实验的完整代码:

^{pr2}$

Tags: pathanswerself路径indexifvalueelement
1条回答
网友
1楼 · 发布于 2024-04-26 11:53:12

您几乎可以做到,但是您的itemChange方法有一个off-by-one错误。在

我会把你的例子改写成这样:

class Node(QGraphicsEllipseItem):
    ...
    def itemChange(self, change, value):
        if change == QGraphicsItem.ItemPositionChange:
            self.path.updateElement(self.index, value.toPoint())
        return QGraphicsEllipseItem.itemChange(self, change, value)

class Path(QGraphicsPathItem):
    ...    
    def updateElement(self, index, pos):
        self.path.setElementPositionAt(index, pos.x(), pos.y())
        if index == 0:
            self.path.setElementPositionAt(
                self.path.elementCount() - 1, pos.x(), pos.y())
        self.setPath(self.path)
        self.scene.update()

相关问题 更多 >