Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.1 - Qt Creator : 4.3.1 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

[Qt4-Win] Drag'n drop sur MDI

J'ai repris l'exemple de Qt mainwindows/mdi pour y rajouter les fonctionalites de Drag'n Drop.
Dans les classes MainWindow et MdiChild, j'ai rajoute:
- dans le constructeur : setAcceptDrops( true );
- les fonctions protegees :
virtual void dragEnterEvent( QDragEnterEvent *de ) { de->setAccepted( true ); }
virtual void dropEvent( QDropEvent *de ) { std::cout << __PRETTY_FUNCTION__ << std::endl; }

Lorsque j'essaie de glisser un fichier sur une fenetre de type MdiChild, j'obtiens l'icone 'sens interdit' !
Quand je deplace le fichier sur le fond du 'MdiArea', le Drag'nDrop est accepte.

Plus 'amusant', quand je change le code de la classe 'MdiChild' en ecrivant :
virtual void dragEnterEvent( QDragEnterEvent *de ) { de->setAccepted( false ); }
le Drag'nDrop sur une fenetre de type 'MdiChild' est accepte, mais c'est la fonction dropEvent de la classe MainWindow qui est appelee !?

Sous linux, le meme code fonctionne correctement...

Quelqu'un a-t-il eu le meme probleme, ou ai-je oublie quelquechose ??

Réponses

  • Il faut que tu réimplémentes également dragMoveEvent dans MdiChild. Ce n'est pas très intuitif, mais ce qui se passe est que dragMoveEvent est appelé directement après dragEnterEvent, et la réimplémentation par défaut ignore l'événement que tu as accepté dans dragEnterEvent, d'où ce que tu observes. Donc il suffit de réimplémenter dragMoveEvent avec un simple event->accept(); ou event->acceptProposedAction(); et ça marche.

    Par contre je me demande pourquoi/comment ça marche sous linux...
  • Merci beaucoup, ca marche enfin !

    Par contre, je confirme, sous linux le code fonctionnait (même en Qt3.3, dans le vieux code, je ne réimplémentais pas dragMoveEvent... bizarre ?)

    Encore merci,


    Philippe
Connectez-vous ou Inscrivez-vous pour répondre.