Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt] QList se vidant?

Sujet résolu
    28 septembre 2013 à 18:06:17

    Bonjour, pouvez-vous m'expliquez pourquoi, dans le code suivant, le QList à une longueur de 0 quand j'appelle la fonction getList, alors que je remplis bien la liste avec un addLigne?

    #include "colonne.h"
    
    Colonne::Colonne(QString titre) :
        m_titre(titre)
    {
    }
    
    QString Colonne::getNom()
    {
        return m_titre;
    }
    
    void Colonne::addLigne(QString ligne)
    {
        m_listTexteLigne << ligne;
        std::cout << "addLigne: " << m_listTexteLigne.length() << std::endl;
        std::cout << "addLigne: " << ligne.toStdString() << std::endl;
    }
    
    
    QList<QString> Colonne::getList()
    {
        std::cout << "getList: " << m_listTexteLigne.length() << std::endl;
        return m_listTexteLigne;
    }
    

    A l'appel de la fonction addLigne, tout est afficher correctement la console, mais une fois que je rappelle getList, je n'ai plus rien, j'espère que quelqu'un m'apportera ses lumières sur ce problème, d'avance, merci.

    • Partager sur Facebook
    • Partager sur Twitter
      28 septembre 2013 à 18:09:48

      La réponse est dans les références.

      Montre un exemple d'utilisation pour voir.

      • Partager sur Facebook
      • Partager sur Twitter
        28 septembre 2013 à 18:18:10

        En voici un:

        y = 0;
            qStringTempo = "";
            while(fichier.get(a))
            {
                qStringTempo.push_back(a);
                if(a == ';')
                {
                    if(y >= liste->getListColonne().length())
                        y = 0;
                    qStringTempo.remove(qStringTempo.length()-1,1);
                    liste->getListColonne()[y].addLigne(qStringTempo); //renvoi une valeur voulue
                    qStringTempo = "";
                    y++;
                }
            }
        
        
        
            for(y=0; y < liste->getListColonne().length(); y++)
            {
                std::cout << "y: " << liste->getListColonne()[y].getList().length() << std::endl; // renvoi 0, non voulu
                for(int i = 0; i < liste->getListColonne()[y].getList().length(); i++)
                {
                    std::cout << "i: " << liste->getListColonne()[y].getList()[i].toStdString();
                }
            }



        -
        Edité par Thall206 28 septembre 2013 à 18:20:03

        • Partager sur Facebook
        • Partager sur Twitter
          28 septembre 2013 à 18:39:03

          Quel est le prototype de getListColonne ?

          Si la fonction ne retourne pas une référence, les ajouts sont fait sur une copie. Il en va de même pour Colonne::getList. Toutes les modifications faites sur la liste récupérer ne modifieront pas Colonne::m_listTexteLigne car getList retourne une copie. À voir si c'est voulut ou pas.

          Je te conseille de (re)lire le cours sur les références.

          • Partager sur Facebook
          • Partager sur Twitter
            28 septembre 2013 à 18:47:39

            le .h du .cpp:

            #ifndef COLONNE_H
            #define COLONNE_H
            
            #include <iostream>
            
            #include <QString>
            #include <QList>
            #include <QTextEdit>
            
            class Colonne
            {
            public:
            
                Colonne(QString titre);
                QString getNom();
                void addLigne(QString ligne);
                QList<QString> getList();
            private:
            
                QString m_titre;
                QList<QString> m_listTexteLigne;
                int m_nbreDeLigne;
            
            };
            
            #endif // COLONNE_H
            

            Je ne comprends pas ce que tu dis à propos des références, tu veux dire que m_listTexteLigne est bien changé, mais que getLine renvois une copie?

            • Partager sur Facebook
            • Partager sur Twitter
              28 septembre 2013 à 19:24:40

              Oui m_listTexteLigne est bien changé. Mais le problème de copie est la classe au-dessus (la variable liste et la méthode getListColonne).

              en gros liste->getListColonne()[y].addLigne(qStringTempo); fait: liste.getListColonne renvoi une copie (un type QList<Colonne> je suppose) tu ajoutes un élément à cette liste la liste copier est supprimer (il n'y a plus rien qui l'utilise). liste.la_liste_de_colonne n'a pas changé car tu n'as travailler que sur une copie et donc liste->getListColonne() renvoi toujours une liste identique. Par conséquent liste->getListColonne()[y].length() est toujours vide.

              -
              Edité par jo_link_noir 28 septembre 2013 à 19:25:17

              • Partager sur Facebook
              • Partager sur Twitter
                28 septembre 2013 à 19:30:40

                Donc, en gros, pour résoudre le problème, il faut que getList renvois une référence ! Merci ! Je teste tout de suite

                Edit: Je vois pas trop, en fait :/
                Faut il que la fonction getListColonne retourne un pointeur

                Edit 2: Après avoir relu tes réponses, j'ai compris ce que tu voulais dire, j'étais à la traîne, merci beaucoup ! :D

                Sujet résolu !

                -
                Edité par Thall206 29 septembre 2013 à 11:19:46

                • Partager sur Facebook
                • Partager sur Twitter

                [Qt] QList se vidant?

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown