2017-10-20 18 views
0

J'ai un QGraphicsItem que l'utilisateur peut faire glisser. Je veux garder l'élément dans le quadrant supérieur droit de ma scène, donc je l'emporterait sur mouseMoveEvent comme ceci:Preeventing QGraphicsItem's itemChangement

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()) 

fonctionne comme un charme, si tout va bien.

Maintenant, j'utilise itemChanged pour lancer les calculs lorsque l'élément se déplace. Bien que mon objet soit resté immobile quand il a atteint ma limite définie, itemChanged est appelé aussi quand ma souris est dans la 'zone interdite', ce qui est compréhensible. Je voudrais bloquer ce comportement en fonction des vérifications ci-dessus. Puisque QGraphicsItem n'est pas un QObject, blockSignals ne fonctionne pas ici. Une idée de comment je peux y parvenir?

+0

Ne pas effectuer la vérification avant d'émettre l'événement, mais dans la fonction de réception avant de traiter quoi que ce soit – SteakOverflow

Répondre

1

Personnellement, je préfère utiliser ItemChange (...) lorsque vous travaillez avec l'infrastructure de vue de scène. Évitez d'utiliser mouseMoveEvent.

Pour désactiver itemChange, vous pouvez définir l'élément sur non déplaçable.

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

+1 pour le conseil de ne pas utiliser mouseMoveEvent. Cela échoue quand je sélectionne plus d'un objet et que je le déplace, parce que seul celui que je traîne reçoit les mouseMoveEvents, ceux qui se déplacent pour franchir heureusement les limites du quadrant. Je vérifie et ajuste maintenant la position de l'objet dans itemChange(), et pour éviter la récursion je retourne la position ajustée. Ce genre de travaux, mais mes objets sautent et scintillent, puisqu'ils sont en fait visiblement déplacés en dehors des limites données et ensuite ajustés rétroactivement dans itemChange. Comment puis-je éviter cela? – zeus300

+0

Il y a deux appels liés à l'effacement, QGraphicsView :: setCacheMode (QGraphicsView :: CacheBackground); QGraphicsView :: setViewportUpdateMode (QGraphicsView :: BoundingRectViewportUpdate); –