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 :

Insérer un objet perso dans une QList


Sujet :

Qt

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 94
    Par défaut Insérer un objet perso dans une QList
    Bonjour à tous,

    J'ai une classe perso qui se nomme : Annotation.
    Dans mon prog principal, je déclare ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QList<Annotation *> liste_annotations;
    J'ai une fonction qui lit un morceau de fichier XML, me charge une combobox et met les objets dans la liste :

    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
    18
    19
    20
    21
    22
    void MainWindow::chargerCombo(QDomElement annotation,QString leDossier){
        Annotation *lannot;
        QString  lenom,source;
        int i=0,taille=0;
        while(!annotation.isNull()){
            source = annotation.attribute("src","");
            lenom = annotation.attribute("name","");
            //On créer l'objet Annotation
            lannot = creerObjetAnnotation(source,leDossier);
            //On insérer l'annotation dans la liste liste_annotations
            liste_annotations<<lannot;
            taille = liste_annotations.length();
            //On insère le nom de l'annotation dans la combobox
            ui->annotations_cb->insertItems(i,QStringList()<<lenom);
             //On passe à la suivante (NULL s'il n'y a pas de suivant)
            annotation = annotation.nextSibling().toElement();
            //On incrémente le compteur
            i++;
     
        }
     
    }
    Ma fonction qui créer l'objet :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    //Fonction qui créer l'objet Annotation
    Annotation * MainWindow::creerObjetAnnotation(QString source,QString leDossier){
        Annotation *mon_annotation = new Annotation();
        //Lecture de l'arborescence
        QDomDocument doc;
        QFile f(leDossier+source);
        f.open(QIODevice::ReadOnly);
        doc.setContent(&f);
        f.close();
     
        QDomElement root=doc.documentElement();
        mon_annotation->setId(root.attribute("acquisitionId","-1").toInt());
        QDomElement child = root.firstChild().toElement();
        /*Plutôt que d'utiliser un constructeur qui sera illisible en cas de maintenance
          nous créons l'objet par étapes*/
        mon_annotation->setNom(child.attribute("name","Aucun nom"));
        mon_annotation->setIdPraticien(child.attribute("authorId","-1").toInt());
        QDomElement grandchild = child.firstChild().toElement();
        mon_annotation->setType(grandchild.attribute("type","aucun type"));
        mon_annotation->setType_x(grandchild.attribute("x","-1").toInt());
        mon_annotation->setType_y(grandchild.attribute("y","-1").toInt());
        mon_annotation->setType_w(grandchild.attribute("w","-1").toInt());
        mon_annotation->setType_h(grandchild.attribute("h","-1").toInt());
        mon_annotation->setR(grandchild.attribute("r","-1").toInt());
        mon_annotation->setG(grandchild.attribute("g","-1").toInt());
        mon_annotation->setB(grandchild.attribute("b","-1").toInt());
        mon_annotation->setAlpha(grandchild.attribute("alpha","-1").toInt());
        grandchild = grandchild.nextSibling().toElement();
        mon_annotation->setOrigine_x(grandchild.attribute("x","-1").toInt());
        mon_annotation->setOrigine_y(grandchild.attribute("y","-1").toInt());
        mon_annotation->setOrigine_z(grandchild.attribute("z","-1").toInt());
        grandchild = grandchild.nextSibling().toElement();
        mon_annotation->setCommentaires(grandchild.text());
        return mon_annotation;
    }
    Le problème est que l'insertion dans la liste_annotations se fait mal : en mode débug, tout est bon (les objets existent et sont cohérents). La première insertion se fait bien, taille = 1 et je peux voir l'objet dans la fenêtre des variables.
    Par contre, pour le 2e objet (il n'y a que 2 objets dans mes tests), l'insertion écrase le premier au lieu de le mettre au bout de la QList : je n'ai donc qu'un seul objet à la fin dans ma liste.
    J'ai essayé les méthodes : append, push_back et insert(index, objet) -> d'où mon compteur i. Mais rien n'y fait, toujours le même problème :s

    Pouvez vous m'aider ?

    Merci d'avance xD

  2. #2
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 63
    Par défaut
    Salut!!

    Lorsque tu fais: "liste_annotations<<lannot"
    Tu insères forcément ton objet en fin de liste. A mon avis, le problème ne vient pas de l'ajout dans la liste mais de la création de ton objet lannot.
    Tu dois te perdre quelque part dans le XML ce qui fait que tu n'ajoutes plus les objets suivants. (Et donc tu as toujours ton premier objet dans ta liste)

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 94
    Par défaut
    Non j'ai bien un objet différent dans lannot, mais le problème ne viendrait pas justement du lannot * ?

    Ne devrais je pas le supprimer à chaque fois pour le recréer ?

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 63
    Par défaut
    Pour moi ça reste un objet temporaire et tu peux le gérer une fois dans la liste avec les index donc je ne pense pas que ce soit le problème.

    Par contre quelque chose qui n'a rien à voir:
    A ta place, je n'ouvrirais qu'une seule fois le XML pour stocker toutes les infos dont tu as besoins et le cloturer une fois pour toutes.
    Ensuite tu auras une fonction creerObjetAnnotation plus lisible mais surtout qui ne fait pas ouvrir/fermer le fichier à chaque création d'objet...

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 94
    Par défaut
    En fait mes annotations sont dans un fichier différent à chaque fois : une annotation -> un fichier xml
    Source -> nom du fichier avec extension XML
    Dossier -> dossier où se trouve le fichier XML

    dans mon dossier :
    annotation1.xml
    annotation2.xml
    (c'est dans les contraintes du projet).

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 63
    Par défaut
    Ah ok.
    Mais j'aurais quand même fait une classe pour la lecture du XML.

    Avec ceci tu stocke ton fichier en mémoire:
    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
    LectureXML::LectureXML(){
        QString fileName = QDir::currentPath() + "\\Fichier.xml";
        QFile file(fileName);
     
        if (!file.open(QIODevice::ReadOnly))
        {
            return;
        }
        if (!this->doc.setContent(&file))
        {                              //établit le document XML à
            file.close();             //partir des données du fichier (hiérarchie, etc)
            return;
        }
        file.close();
     
    }
    Après tu créé tes fonctions qui vont chercher les infos qui t'intéressent. (En te servant de DOM)
    Je trouve ça plus propre.

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 94
    Par défaut
    I like it

    Bon contrainte qui vient de tomber, faut utiliser STL, donc je vais me tenter les Vector

  8. #8
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 94
    Par défaut
    Bah voila, avec les vector ça passe nikel !!
    Merci pour l'idée de la classe XML

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

Discussions similaires

  1. insérer une image comme objet ole dans une table
    Par Loutron dans le forum Modélisation
    Réponses: 4
    Dernier message: 29/12/2011, 19h11
  2. Insérer un objet 3D dans une scène OpenGL
    Par choko83 dans le forum OpenGL
    Réponses: 11
    Dernier message: 08/10/2009, 14h03
  3. Réponses: 2
    Dernier message: 08/03/2007, 10h50
  4. Transmission d'un objet crée dans une fonction
    Par EvilAngel dans le forum ASP
    Réponses: 2
    Dernier message: 10/05/2004, 20h19
  5. [Vb.net] Indexé un objet crée dans une boucle
    Par picpic dans le forum Windows Forms
    Réponses: 10
    Dernier message: 17/12/2003, 14h37

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