在QGraphicsItem(父级)中绘制形状,其位置相对于父级

时间:2012-01-01 19:55:58

标签: qt paint qgraphicsitem qgraphicsscene

我有自己的对象实现QGraphicsItem - 它基本上只是一个带边框的正方形。我试图在该项目中绘制形状,将其用作父项。问题是我用于父级中的形状的坐标不是相对于父级的坐标,而是相对于场景。

示例:我想在QGraphicsLineItem(父级)中绘制QGraphicsItem。父母为50,50,尺寸为20x20。如果我使用坐标0,0,20,20绘制一条指定父级的线,则相对于场景绘制0,0,20,20,而不是父级。

有没有办法让线条(或任何其他形状)相对于父级而不是场景使用位置?或者我是否需要通过检查父母的X和Y来手动确定坐标?

3 个答案:

答案 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