QGraphicsView vector edit:移动节点时更新路径-正确吗?

2024-09-29 21:22:18 发布

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

我正在创建一个矢量编辑窗口。我将元素添加到QGraphicsScene并显示它。我正在编写代码,以便在移动节点时,它也会移动底层路径。
但是我该如何移动通向我试图移动的点的路径的两个关节呢?我首先需要将QPainterPath分解为子路径(如何?唯一的方法,打破子路径似乎是对子路径多边形,但多边形是一组点,它释放曲线信息…)然后在我试图更改的点之前找到该点。我该怎么做呢?在

请参见屏幕截图:http://imgur.com/a/Q7Yy1
移动节点时,仅更新一个关节。在

方形节点的定义如下:

class OnCurvePointItem(QGraphicsRectItem):
    def __init__(self, x, y, width, height, pointX, pointY, pen=None, brush=None, parent=None):
        super(OnCurvePointItem, self).__init__(x, y, width, height, parent)
        self.setFlag(QGraphicsItem.ItemIsMovable)
        self.setFlag(QGraphicsItem.ItemIsSelectable)
        self.setFlag(QGraphicsItem.ItemSendsGeometryChanges)
        if pen is not None: self.setPen(pen)
        if brush is not None: self.setBrush(brush)

        # Absolute coordinates of the points in the path
        self._pointX = pointX
        self._pointY = pointY

    """ # disabled, trying to use itemChange instead.
    def mouseMoveEvent(self, event):
        pos = event.pos()
        print(pos)
        super(OnCurvePointItem, self).mouseMoveEvent(event)
        path = self.scene()._outlineItem.path()
        path.setElementPositionAt(0, pos.x(), pos.y())
        self.scene()._outlineItem.setPath(path)
        #self.scene().update()
    """

    def itemChange(self, change, value):
        #print(change)
        if change == QGraphicsItem.ItemPositionHasChanged:
            # this is the outline path to mutate, stashed in the scene
            path = self.scene()._outlineItem.path()

            #for i in range(path.elementCount()):
            #    elem = path.elementAt(i)
            #    if elem.isCurveTo(): kind = "curve"
            #    elif elem.isLineTo(): kind = "line"
            #    else: kind = "move"
            #    print("{}: {} {}".format(kind, elem.x, elem.y))
            #print()

            # self.pos() is relative to the original position in the scene
            # hardcoding element 0 till I store index in the item object
            path.setElementPositionAt(0, self._pointX+self.pos().x(), self._pointY+self.pos().y())
            self.scene()._outlineItem.setPath(path)
        return QGraphicsItem.itemChange(self, change, value)

谢谢你,我有点困在这里了。最终有没有你所知道的向量版的简单Qt例子?
我发现了一个叫做Carve的软件,但是代码库相当复杂,我找不到任何与我在这里做的事情相关的东西


Tags: thepathinposself路径noneif

热门问题