Рисуване на форми в рамките на QGraphicsItem (родител) с позиции спрямо родителя

Имам собствен обект, изпълняващ QGraphicsItem - по същество това е просто квадрат с граница. Опитвам се да нарисувам фигури в този елемент, като го използвам като родител. Проблемът е, че координатите, които използвам за формите в рамките на родителя, не са спрямо координатите на родителя, а по-скоро на сцената.

Пример: Искам да нарисувам QGraphicsLineItem в моя QGraphicsItem (родител). Родителя е на 50,50, с размери 20х20. Ако начертая линия с посочения родител, използвайки координати 0,0,20,20, тя рисува на 0,0,20,20 спрямо сцената, а не спрямо родителя.

Има ли начин да накарате линията (или всяка друга форма) да използва позиции спрямо родителя, а не сцената? Или ще трябва ръчно да определя координатите, като проверя X и Y на родителя?


person giraffee    schedule 01.01.2012    source източник


Отговори (3)


Какво ще кажете да накарате всеки от вашите 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 позициите на обекта спрямо родителя.

person D K    schedule 02.01.2012
comment
Благодаря - по същество това е, което планирам да направя. - person giraffee; 02.01.2012

Единственото нещо, което ми идва на ум, е да използвам QGraphicsItem::mapToScene върху родителския елемент, преди да задам координата за рисуване на деца.

person j_kubik    schedule 01.01.2012

Опитвали ли сте да използвате QGraphicsItem::setParentItem и да се позовавате на QGraphicsItem::parentItem, когато задавате позицията на вашия QGraphicsLineItem?

person Community    schedule 02.01.2012