2017-03-06 1 views
0

Je crée un graphe de noeud et je veux être capable de cliquer sur l'espace vide d'une scène et de faire un déplacement du milieu de la souris pour naviguer sans désélectionner les éléments actuellement sélectionnés dans la scène. Aucune suggestion?Comment empêcher un clic de souris du milieu de désélectionner des éléments dans un QGraphicsScene sans le bloquer à partir d'éléments de la scène?

Je peux bloquer le clic du milieu dans mousePressEvent de la vue et obtenir le bon comportement, mais je n'ai plus d'événements de clic de souris sur les éléments de la scène. Cela ne me dérange pas un clic du milieu résultant en une sélection unique en cliquant sur un élément de la scène, mais si je clique sur le milieu de l'espace vide dans la scène, je ne veux pas que la sélection soit modifiée.

Cela ne couvre pas le comportement plus complexe que je cherche: PyQt. How to block clear selection on mouse right click?

Je ne l'ai pas essayer d'utiliser un eventFilter que je suppose que la question serait la même

J'utilise PyQt/PySide , FWIW. Avant de lancer ma propre solution de contournement, j'ai pensé que je posterais ici pour la bonne façon ou au moins d'autres solutions de contournement.

Quelques idées de contournement:

  • Bloquer l'mousePressEvent à la scène, mais itérer sur les éléments enfants pour livrer directement
  • Restaurer la sélection tout en restant dans la mousePressEvent dans la scène. Probablement mauvais pour la performance à l'échelle mais simple je suppose.

Tout commentaire serait génial!

[Éditer:] Voici ma version python de la réponse. Code testé. Dans ma classe dérivée QGraphicsScene:

def mousePressEvent(self, event): 
    # Prevent the QGraphicsScene default behavior to deselect-all when clicking on 
    # empty space by blocking the event in this circumstance. 
    item_under_the_mouse = self.itemAt(event.scenePos()) 
    if event.button() == QtCore.Qt.MidButton and not item_under_the_mouse: 
     event.accept() 
    else: 
     super(GraphScene, self).mousePressEvent(event) 

Répondre

1

Dans votre QGraphicsScene::mousePressEvent mise en œuvre dérivée, si elle est un clic de la souris, vérifier des éléments sous le clic de la souris. S'il n'y en a pas, acceptez l'événement et n'appelez pas l'implémentation de la classe de base. Si quelque chose est sous le clic, appelez simplement l'implémentation de base; vous n'avez pas à essayer de le réimplémenter vous-même. Je pense que cela est l'idée générale:

void MyScene::mousePressEvent (QGraphicsSceneMouseEvent *evt) 
{ 
    if ((evt->buttons() & Qt::MidButton) && items (evt->scenePos().count()) 
    { 
     QGraphicsScene::mousePressEvent (evt); 
    } 
    else 
    { 
     evt->accept(); 
    } 
} 

Je ne sais pas si le accept est nécessaire dans ce cas ou non. Je n'ai pas compilé ou testé cela, mais j'espère que cela vous aidera à aller dans la bonne direction.

+0

C'est la direction que je prenais. Content de voir confirmation. Je posterai la version python une fois que je l'aurai fonctionné. – Rafe

+0

Excellent ... Je ne connais pas Python, mais je l'ai trouvé assez facile de convertir en va-et-vient dans les réponses. – goug