2017-10-20 104 views
0

我有一個QGraphicsItem,用戶可以拖動。我想保留的項目在我的場景的右上象限,所以我推翻mouseMoveEvent這樣的:Preeventing QGraphicsItem的itemChanged

def mouseMoveEvent(self, event): 
    if self.x() < 0: 
     self.setPos(0, self.y()) 
    if self.y() + self.rect().height() > 0: 
     self.setPos(self.x(), -self.rect().height()) 

工程就像一個魅力,到目前爲止,一切順利。

現在我使用itemChanged來啓動項目移動時的計算。儘管當我的物品到達我定義的邊界時,我的物品仍保持靜止,但當鼠標處於「禁區」時,itemChanged也會被調用,這是可以理解的。 我想根據上述檢查來阻止這種行爲。由於QGraphicsItem不是QObject,所以blockSignals在這裏不起作用。任何想法如何我可以實現這一目標?

+0

您處理的意見不使用任何mouseMoveEvent +1 – SteakOverflow

回答

1

我個人更喜歡在使用場景視圖框架時使用ItemChange(...)。避免使用mouseMoveEvent。

要禁用itemChange,您可以將項目設置爲不可移動。

{ 
    setFlag(QGraphicsItem::ItemSendsGeometryChanges , false); 
... 
    setFlag(QGraphicsItem::ItemSendsGeometryChanges , true); 
} 
+0

前不要發射事件之前進行檢查,但在接收功能。當我選擇多個項目並移動它們時會失敗,因爲只有我拖動的項目纔會收到mouseMoveEvents,那些正在爲這次騎行順利進行的項目會越過象限邊界。我現在檢查並調整itemChange()中的「對象位置」,並且爲了避免遞歸,我返回調整後的位置。這類作品,但我的物體跳動和閃爍,因爲它們實際上明顯移動到給定的邊界之外,然後在itemChange中追溯調整。我怎樣才能避免這種情況? – zeus300

+0

有兩個與輕彈相關的調用,QGraphicsView :: setCacheMode(QGraphicsView :: CacheBackground); QGraphicsView :: setViewportUpdateMode(QGraphicsView :: BoundingRectViewportUpdate); –