我正在创建一个矢量编辑窗口。我将元素添加到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的软件,但是代码库相当复杂,我找不到任何与我在这里做的事情相关的东西
最后,我选择在每次移动时使用点坐标从头开始创建新的更新路径,并在移动发生时调用
QGraphicsPathItem.updatePath()
。在这就避免了对低级操作的需要,qpanterpath并不是专门为之设计的。在
相关问题 更多 >
编程相关推荐