我有自己的对象实现QGraphicsItem
- 它基本上只是一个带边框的正方形。我试图在该项目中绘制形状,将其用作父项。问题是我用于父级中的形状的坐标不是相对于父级的坐标,而是相对于场景。
示例:我想在QGraphicsLineItem
(父级)中绘制QGraphicsItem
。父母为50,50,尺寸为20x20。如果我使用坐标0,0,20,20绘制一条指定父级的线,则相对于场景绘制0,0,20,20,而不是父级。
有没有办法让线条(或任何其他形状)相对于父级而不是场景使用位置?或者我是否需要通过检查父母的X和Y来手动确定坐标?
答案 0 :(得分:2)
你如何让你的每个QGraphicsItem
都继承自QObject
,并将父母传给每个人?。然后,根据父级坐标确定场景中的位置(递归):
class Scene(QGraphicsScene):
def __init__(self):
QGraphicsScene.__init__(self)
def xpos(self):
return 0
def ypos(self):
return 0
class RelativeItem(QGraphicsRectItem, QObject):
def __init__(self, parent):
QGraphicsRectItem.__init__(self)
QObject.__init__(self, parent)
def xpos(self):
return self.scenePos().x() - self.parent().xpos()
def ypos(self):
return self.scenePos().y() - self.parent().ypos()
scene = QGraphicsScene()
obj1 = RelativeItem(scene) # Relative to scene
obj2 = RelativeItem(obj1) # Relative to obj1
xpos()
和ypos()
以递归方式调用父级xpos()
和ypos()
(场景在(0, 0)
处进行硬编码),并从对象中减去它在场景中的位置。这意味着这两个函数返回对象相对于父对象的x和y位置。
答案 1 :(得分:1)
我唯一想到的是在设置子绘图坐标之前在父项上使用QGraphicsItem::mapToScene
。
答案 2 :(得分:1)
在设置QGraphicsItem::setParentItem
的位置时,您是否尝试过使用QGraphicsItem::parentItem
并参考QGraphicsLineItem
?