2010-01-05 4 views
2

QGraphicsScene de Qt offre de belles fonctionnalités en sortie de boîte: l'utilisateur peut sélectionner des objets et les déplacer.Comment obtenir des événements de déplacement d'élément de rapport QGraphicsScene

Je veux une chose de plus - recevoir des notifications lorsque l'utilisateur a fini de déplacer l'objet. Il y a des événements de niveau inférieur, comme le déplacement de la souris, appuyez sur, relâchez, mais je ne voudrais pas réimplémenter la fonctionnalité qui est déjà là (en déplaçant les objets).

La méthode http://doc.trolltech.com/4.2/qgraphicsitem.html#itemChange ressemble à cela, mais elle n'est pas appelée lorsque l'utilisateur déplace l'objet.

J'utilise Qt 4.6

Il s'avère que vous devez définir un indicateur pour activer cet événement: item-> setFlag (QGraphicsItem :: ItemSendsGeometryChanges, true);

Mais maintenant l'événement est déclenché chaque fois que l'élément corrige le changement. Je veux avoir un événement seulement quand le changement est fait par l'utilisateur.

Répondre

1

Je pense que le meilleur moyen est l'implémentation de l'événement mouseRelease pour vos objets, quand il est déclenché, vous serez en mesure de savoir si l'objet a été déplacé ou non. Si l'élément a été déplacé, acceptez l'événement, sinon envoyez l'événement à la classe de base.

Par exemple:

void YourItem::mouseReleaseEvent(QMouseEvent *event) 
{ 
    if (wasMoved()) { 
     //do something and accept the event 
    } else { 
     // to the base class 
     QGraphicsItem::mouseReleaseEvent(event); 
    } 
} 

WasMoved() est votre méthode pour savoir si l'article a été déplacé

+0

C'est ce que je fais en ce moment et ça marche un peu, mais je mets à jour les objets par programme et il en résulte que sur chaque release de souris TOUS les objets sont considérés comme déplacés même s'il n'y a aucun mouvement réel. – Viesturs

+0

Où écrivez-vous cette fonction sur votre classe vue/scène ou dans votre classe d'objet? – Drewen

+0

Cette fonction appartient à ma classe d'objets. Le cas non trivial est qu'il peut y avoir plusieurs objets sélectionnés qui sont déplacés, donc je teste tous les éléments à déplacer. Je suppose que l'utilisation de QGraphicsScene :: selectedItems() donnerait le bon résultat. – Viesturs

1

Sauf que cela ne fonctionne pas toujours comme vous ne recevez pas toujours mouseReleaseEvent .. .

le code qui fait le traînement est le code bloque cependant, vous pouvez le mettre là-bas, car le code ne continuera après avoir relâché le bouton de la souris et il fonctionne toujours ... (QT 4.7+)

Questions connexes