Comment implémenter un widget glisser-déposer sur un autre conteneur dans Qt ?[fermé]

StackOverflow https://stackoverflow.com//questions/20002566

  •  20-12-2019
  •  | 
  •  

Question

J'ai une fenêtre avec plusieurs conteneurs.Quelle est la manière la plus simple d'implémenter le glisser-déposer entre eux ?

Était-ce utile?

La solution

Vous devez utiliser un QDrag* objet.Puis réimplémentez :

virtual void mousePressEvent(QMouseEvent * event);
virtual void mouseReleaseEvent(QMouseEvent * event);
virtual void mouseMoveEvent(QMouseEvent *event);

À l'intérieur de ces événements, vous gérerez un point de départ (où le glisser commence) et un point final (où vous déposez le widget).Vous utiliserez également le protocole MIME pour permettre au framework de gérer l'opération glisser-déposer.

Un article plus utile sur le glisser-déposer est le suivant : Glisser-déposer

Autres conseils

Le moyen le plus simple, je suppose, serait de créer eventFilter classe, où vous filtreriez les événements glisser-déposer et installer il (someWidget->installEventFilter) vers tous vos widgets, là où vous souhaitez effectuer un glisser-déposer.Exemple tiré de la documentation - ici

mise à jour:

Le problème avec eventfilter est que vous n'avez pas besoin de sous-classer tous vos widgets pour pouvoir les glisser-déposer.Installez simplement le filtre sur n'importe quel widget pour lequel vous souhaitez avoir un filtre DND et il l'aura.

Quant au filtre lui-même, il ne bloque pas toujours les événements, etc. (il le fera si telle est votre intention).C'était juste un exemple de la façon dont on peut l'utiliser.

Une des innombrables options du glisser-déposer :dans dropEvent, dragMoveEvent, dragEnterEvent, votre filtre se souviendra peut-être du pointeur vers ce que vous voulez déposer et dans dropEvent émettra un signal avec l'objet, cet événement détient le pointeur et l'attrapera avec le widget là où vous le déposez, et c'est tout, tout widget qui a le filtre installé aura un glisser-déposer.

L'intérêt du filtre d'événements n'est PAS de se soucier du sous-classement et de la connexion de CHAQUE widget si vous avez le type d'événement commun, que vous souhaitez capturer et traiter de la même manière, comme les événements glisser-déposer par exemple.

J'ai supposé que vous saviez comment glisser-déposer, mais j'ai pensé que remplacer les événements dans tous les widgets avec le même code encore et encore n'était peut-être pas si correct.Je vous ai donc montré comment cela peut être facilement réalisé avec un seul filtre d'événements pour tous les widgets que vous souhaitez faire glisser et déposer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top