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 :

QListWidget : retirer un item


Sujet :

Qt

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut QListWidget : retirer un item
    Bonjour à tous

    Ca fait quelques jours que j'ai commencé à coder avec Qt, j'ai vite été séduit par cette bibliothèque qui est assez impressionnante d'ailleurs !
    Je vous expose le principe de ce que je voudrais faire:

    ClassGenerator est un petit logiciel qui permet, en cochant des cases ou en remplissant des champs, de générer le code de base d'une classe définie dans un header (protection contre les inclusions infinies, type d'héritage, constructeur, destructeur etc.). Arrivé à la fin du TP il nous est proposé quelques idées d'amélioration dont une qui me pose problème depuis un petit moment, il s'agit de permettre à l'utilisateur de renseigner les attributs de la classe.
    Je m'y suis donc pris comme ça, j'ai un onglet "Attributs" qui contient deux QGroupBox, l'une permet de renseigner le type de l'attribut, son nom et de le créer via un bouton, l'autre est un simple QListWidget qui affiche les attributs créés. Et en-dessous, il y a un bouton "Effacer l'attribut" qui devrait, normalement, faire en sorte que lorsque l'on clique sur un attribut, puis sur le bouton, l'attribut disparaisse.
    J'ai passé quelques heures à tourner la doc dans tous les sens, mais je ne vois vraiment pas quoi faire, vous auriez une idée ?

    Merci =)

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Salut,

    Si j'ai bien compris, ta question est :
    Comment supprimer un "attribut", qui est en fait une simple ligne de texte dans un fichier .h, non ?
    Il faut que tu récupères le contenu de ton fichier, que tu trouves ton attribut (tu dois avoir son nom si tu le choisis dans la liste), et tu supprimes cet "attribut" (nom + type, voire toute la ligne selon ta mise en page).

    Pour cela, tu peux utiliser un QTextStream.

    Bonne Chance,

    G.

    PS : Il se peut que je n'aies rien compris à la question.

  3. #3
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Salut,

    Le but du jeu est plutôt de supprimer l'item en cours
    Pour faire ça, tu as juste à supprimer l'item par un delete myItem;

  4. #4
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Arf, bon je vais essayer d'être plus clair ^^

    Voici une capture d'écran du programme :

    http://img353.imageshack.us/my.php?image=zgcpm3.png

    Et quand je clique sur "Supprimer l'attribut", "double hippopotame" doit être viré de la liste =)

    Et voici les deux slots personnalisés qui me permettent d'ajouter un item à la liste, et le second slot (bugged) qui doit me permettre de le virer :

    http://rafb.net/p/zfQTm647.html
    attributs est une structure contenant le nom, le type et les accesseurs de chaque attributs créés, et nb_attributs une variable incrémentée à chaque nouvel attribut créé.

  5. #5
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Tu oublies de supprimer l'attribut du conteneur attributs j'ai l'impression

  6. #6
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Oui, j'étais tellement concentré sur ce problème que j'avais même pas fait gaffe à ça.
    Mais le problème n'est pas là, quand je clique sur "Supprimer l'attribut", il faut que l'attribut disparaisse complètement de la liste (et il n'y a pas de lien direct entre l'item de la liste et l'élément correspondant à cet item dans la structure attributs, supprimer l'un ne supprimera pas l'autre).

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    As tu une erreur de compilation, ou est ce que l'action du bouton ne fait rien ?
    Sinon, en regardant vite fait la doc, j'ai remarqué que QListWidget->selectedItems() (il manque le dernier "s" dans ton code) renvoit une QList<QWidgetItem*>.
    Peut être manque-t-il simplement le "s", ou peut-être qu'il faut que tu parcours les éléments de ta liste renvoyée par la fonction selectedItems().

    selectedItem est une fonction utilisée dans Qt3.x.x, est ce la version que tu utilises ?

    G.

  8. #8
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Bien vu; tu peux utiliser currentItem() à la place

  9. #9
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Alors non je n'ai pas d'erreurs de compilation, c'est juste que quand je clique sur le bouton, il ne se passe rien (rien de visible en tout cas).
    Le "s" manquant doit juste être dû au fait que j'ai écrit plusieurs versions du code avec des choses différentes pour finalement arriver à ça, sans compiler ^^

    J'utilise la dernière version de Qt : 4.4.0, mais où vois-tu qu'elle n'est plus utilisée qu'en 3.x.x ?

    Et comment je fais pour parcourir les éléments de la liste ? Avec un iterator ?

    J'ai déjà essayé currentItem() mais ça ne change rien (ou alors je l'ai mal utilisé peut-être =) ).

  10. #10
    Membre régulier
    Avatar de mac&cheese
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    Points : 96
    Points
    96
    Par défaut
    D'apres ce que j'ai pu voir dans ton code tu controles les doublons des attributs (normal pour un header). Si j'ai bien compris liste_attributs et attributs ne sont pas directement liés.
    Donc sachant qu'il ne pet pas y avoir deux fois le meme nom, pourquoi ne pas parcourir ta liste afin de trouver l'attribut qui correspond au QListWidgetItem correspondant et tu le supprimes.
    Quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    void MainWindow::supprimer_attribut()
    {
        for(int k = 0; k < nb_attributs; k++)
        {
           QString temp;
           temp << attributs[nb_attributs].nom;
           temp << " ";
           temp << attributs[nb_attributs].type;
     
           if ( temp == ( (liste_attributs->currentItem())->text() ) )
          {
              attributs.removeAt( k );
              liste_attributs->removeItemWidget(liste_attributs->currentItem());
              return;
          }
        }
    }
    Il est possible que je n'ai pas saisi le problème

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Salut,

    Alors où j'ai vu selectedItems() / selectedItem(), c'est là :
    http://qt.developpez.com/doc/latest/functions.html#s
    (recherche selectedItem dans la liste)

    Sinon, pour parcourir une liste, c'est pas la mort. Tu peux commencer par faire un takeFirst() pour tester.
    http://qt.developpez.com/doc/latest/qlist.htmlhttp://qt.developpez.com/doc/latest/qlist.html[/URL]

    Pour reprendre ton code, ca devrait donner un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void MainWindow::supprimer_attribut()
    {
    if(!liste_attributs->selectedItems().isEmpty())
        liste_attributs->removeItemWidget(liste_attributs->selectedItem().takeFirst());
    }
    Mon commentaire ne prend pas en compte les remarques d'ordre "sémantique" faites par les autres participants.

    Bonne chance

    G.

  12. #12
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    selectedItem() appartient à Q3ListBox et Q3ListView qui sont les classes gardées pour faciliter la transition vers Qt4.

    J'en viens à me demander si ton slot est exécuté quand même. Tu voudrais pas vérifier que tu passes dedans? (genre par un qDebug("toto"); ça suffira amplement ici, tant que tu n'oublies pas d'activer la console)

  13. #13
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Désolé, je n'ai pas beaucoup de temps en ce moment, je venais juste vous signifier que j'ai bien lu vos remarques et que j'essaierai de les mettre en pratique dès que possible.

    P.S : Mon slot est bien appelé, j'ai fait le test.

Discussions similaires

  1. [QtGui] [QListWidget] Ordre des items modifiés
    Par mokochan dans le forum PyQt
    Réponses: 9
    Dernier message: 29/07/2013, 09h36
  2. [QtGui] QListWidget : intervertir des items
    Par mokochan dans le forum PyQt
    Réponses: 2
    Dernier message: 26/06/2013, 08h36
  3. [QtGui] QListWidget : activer un item
    Par Pacifick_FR42 dans le forum PyQt
    Réponses: 3
    Dernier message: 22/12/2010, 18h45
  4. retirer un item
    Par the_angel dans le forum Qt
    Réponses: 3
    Dernier message: 23/06/2008, 19h09
  5. [VB.Net][DataGrid] Comment retirer des items d'un ComboBox ?
    Par graphicsxp dans le forum Windows Forms
    Réponses: 9
    Dernier message: 20/12/2005, 11h46

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