2012-01-01 26 views
1

我有自己的對象實現QGraphicsItem - 它基本上只是一個帶邊框的正方形。我試圖在該項目內繪製形狀,並將其用作父項。問題在於,我用於父級形狀的座標不是相對於父級的座標,而是相對於場景。在QGraphicsItem(父)中繪製具有相對於父項的位置的形狀

示例:我想在我的QGraphicsItem(父級)內畫一個QGraphicsLineItem。父母是50,50,尺寸20x20。如果我使用座標0,0,20,20繪製一條與指定的父對象相關的線,則相對於場景而不是父對象繪製0,0,20,20。

是否有辦法使線(或任何其他形狀)使用位置相對於父,而不是場景?或者我需要通過檢查父母的X和Y來手動確定座標?

回答

2

你如何使你的每個QGraphicsItem也繼承自QObject,並將父母傳給每個?
然後,確定基於父COORDS在場景中的位置(遞歸):

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位置。

+0

謝謝 - 這實際上是我打算做的。 – giraffee 2012-01-02 17:35:30

1

我想到的唯一情況是在設置子圖繪製座標之前在父項上使用QGraphicsItem::mapToScene

1

您是否在嘗試使用QGraphicsItem::setParentItem並在設置QGraphicsLineItem的位置時參考QGraphicsItem::parentItem

相關問題