Précédent   Forum du club des développeurs et IT Pro > C et C++ > Bibliothèques > Qt
Qt Forum d'entraide technique sur la bibliothèque Qt. Avant de poster -> F.A.Q Qt
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 03/01/2013, 18h13   #1
Neckara
Rédacteur/Modérateur

 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 840
Détails du profil
Informations personnelles :
Nom : Homme Denis
Localisation : France, Loire (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 2 840
Points : 8 629
Points : 8 629
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
Par défaut [Drag&drop]Récupérer l'élément déplacé

Bonjour,

J'ai un QListView dont le modèle est un QStandardItemModel.
Malheureusement lors d'un drag&drop, le QStandardItem déplacé est supprimé pour être recrée lors du drop.

J'ai alors besoin de connaître le QStandardItem qui va être supprimé ainsi que celui qui sera créé.

J'ai donc remplacé ma QListView par une classe perso héritant de QListView.
J'ai redéfini QListView::dropEvent ( QDropEvent * e ) et j'arrive à récupérer le nouveau QStandardItem :
Code :
1
2
3
QStandardItemModel * modele =  (QStandardItemModel *)model();
int ligne = indexAt(e->pos() ).row(); //nouvelle position de l'objet déplacé
modele->item(ligne); //nouveau QStandardItem
.

Par contre impossible d'obtenir le qui sera détruit.

Auriez-vous une idée?
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 10h34   #2
Phelim
Membre expérimenté
 
Homme
Inscription : août 2006
Messages : 316
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : août 2006
Messages : 316
Points : 507
Points : 507
L'une des solutions que je vois, ce n'est pas idéal, est de récupérer le dernier item sélectionné soit au travers du signal rowsAboutToBeRemoved de QAbstractItemModel ou en étendant la methode mousePressEvent de QWidget.

Il te suffit de cloner l'objet pour garder les informations dont tu as besoin en mémoire.
Une instance de QStandardItem n'est pas un QObject dont il a l'avantage de pouvoir être cloné (à vérifier tout de meme).
Phelim est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/01/2013, 11h01   #3
Neckara
Rédacteur/Modérateur

 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 840
Détails du profil
Informations personnelles :
Nom : Homme Denis
Localisation : France, Loire (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 2 840
Points : 8 629
Points : 8 629
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
Merci pour ta réponse,

J'ai trouvé une solution hier soir en conservant le dernier QStandardItem sélectionné en utilisant le signal QListView::pressed(QModelIndex).

Mais je me suis aperçut qu'après un drag&drop le modèle a l'ancien QStandardItem et le nouveau QStandardItem donc ça fausse ma récupération du nouveau QStandardItem grâce au indexAt(e->pos() ).

Je pense donc utiliser itemChanged(QStandardItem*) pour récupérer le nouvel itemChanged(QStandardItem*).
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 19h41   #4
koala01
Modérateur
 
Avatar de koala01
 
Philippe Dunski
Inscription : octobre 2004
Messages : 8 755
Détails du profil
Informations personnelles :
Nom : Philippe Dunski
Âge : 41

Informations forums :
Inscription : octobre 2004
Messages : 8 755
Points : 13 734
Points : 13 734
Envoyer un message via MSN à koala01 Envoyer un message via Skype™ à koala01
Salut,

En fait, le gros problème est peut etre que les QStandardItem sont fortement correlés avec les QModelIndex, dans le sens où il y a une relation étroite entre l'index récupéré et l'objet qui y est associé (voir du coté de itemFromIndex() et de indexFromItem()).

Or, tu n'ignores sans doute pas qu'un QModelIndex n'a une durée de validité que relativement réduite, vu qu'il devient d'office invalide dés que le modèle subit la moindre modification.

Par conséquent, le QStandarItem ne correspond réellement à un index que... tant que le modèle n'a pas été modifié.

Lorsque le modèle se met à jour, il n'a aucune raison de garder un QStandardItem qui n'est associé à aucun QModelIndex (ce qui sera le cas si l'index est supprimé lors du drag), et c'est pour cela que ton QStandardItem est détruit avant d'être recréé (au moment où le modèle se met à jour).

L'idéal est donc peut etre de passer par un QSelectionModel qui aurait comme objectif de garder les informations le temps que tout se remette en place
__________________
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
je ne répondrai à aucune question technique par E-mail, message visiteur ou message privé
Vous avez obtenu votre réponse pensez au bouton en bas de page
koala01 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/01/2013, 20h54   #5
Neckara
Rédacteur/Modérateur

 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 840
Détails du profil
Informations personnelles :
Nom : Homme Denis
Localisation : France, Loire (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 2 840
Points : 8 629
Points : 8 629
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
Citation:
Envoyé par koala01 Voir le message
Lorsque le modèle se met à jour, il n'a aucune raison de garder un QStandardItem qui n'est associé à aucun QModelIndex (ce qui sera le cas si l'index est supprimé lors du drag), et c'est pour cela que ton QStandardItem est détruit avant d'être recréé (au moment où le modèle se met à jour).
Je comprend la logique mais dans un sens il aurait été mieux d'instaurer un système de mouvement interne atomique (avec un signal OVE(int row, int row) ou équivalent) ce qui simplifierait énormément la programmation et serait 100 fois plus intuitif et nous évitant des jours entiers à être bloqué .

Citation:
Envoyé par koala01 Voir le message
L'idéal est donc peut etre de passer par un QSelectionModel qui aurait comme objectif de garder les informations le temps que tout se remette en place
C'est un peu particulier, je n'avais pas besoin des informations contenues mais t'identifier les éléments.
En gros une lecture de playlist aléatoire avec chaque élément ne pouvant passer qu'une seule fois. J'utilise déjà l'AccessibleDescription pour le chemin de la chanson.
Bon, pour le moment j'ai une solution qui marche, je ne la changerais pas mais cela reste très intéressant de voir comment j'aurais pu faire autrement.
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 21h31   #6
koala01
Modérateur
 
Avatar de koala01
 
Philippe Dunski
Inscription : octobre 2004
Messages : 8 755
Détails du profil
Informations personnelles :
Nom : Philippe Dunski
Âge : 41

Informations forums :
Inscription : octobre 2004
Messages : 8 755
Points : 13 734
Points : 13 734
Envoyer un message via MSN à koala01 Envoyer un message via Skype™ à koala01
Citation:
Envoyé par Neckara Voir le message
Je comprend la logique mais dans un sens il aurait été mieux d'instaurer un système de mouvement interne atomique (avec un signal OVE(int row, int row) ou équivalent) ce qui simplifierait énormément la programmation et serait 100 fois plus intuitif et nous évitant des jours entiers à être bloqué .
Je n'en disconviens pas..

Mais le but de mon intervention était surtout de t'aider à comprendre le pourquoi de ton problème
Citation:
C'est un peu particulier, je n'avais pas besoin des informations contenues mais t'identifier les éléments.
En gros une lecture de playlist aléatoire avec chaque élément ne pouvant passer qu'une seule fois. J'utilise déjà l'AccessibleDescription pour le chemin de la chanson.
Bon, pour le moment j'ai une solution qui marche, je ne la changerais pas mais cela reste très intéressant de voir comment j'aurais pu faire autrement.
J'avouerai ne pas avoir très longtemps pensé à cela, ce qui fait que, si tu comptes sur moi pour avoir une solution "correcte", tu seras de la revue

Mais bon, je garde malgré tout la question à l'esprit, on ne sait jamais
__________________
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
je ne répondrai à aucune question technique par E-mail, message visiteur ou message privé
Vous avez obtenu votre réponse pensez au bouton en bas de page
koala01 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h31.


 
 
 
 
Partenaires

Hébergement Web