IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

[Drag&drop]Récupérer l'élément déplacé


Sujet :

Qt

  1. #1
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  2. #2
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Août 2006
    Messages : 317
    Points : 597
    Points
    597
    Par défaut
    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).

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    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*).

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    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
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    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.

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    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
    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
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/01/2011, 15h04
  2. [Dojo] Lors d'un drag'n'drop, tous les éléments de la source bougent
    Par tapoutapou dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 12/08/2010, 09h44
  3. [Dojo] Drag'n'drop - accéder à l'élément qui bouge
    Par tapoutapou dans le forum Bibliothèques & Frameworks
    Réponses: 5
    Dernier message: 30/06/2010, 14h48
  4. drag and drop avec plusieurs éléments
    Par yohan0262 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 17/09/2008, 12h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo