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 :

Manipulation d'un attribut de type QListIterator


Sujet :

Qt

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    Points : 96
    Points
    96
    Par défaut Manipulation d'un attribut de type QListIterator
    Bonsoir à tous,

    (Eh oui encore une question...)
    Alors je fais appel à vous cette fois car je rencontre un petit probleme (mais costaud) avec un QListIterator.
    Voila le probleme:
    First of all, j'avais besoin d'un attribut de type QListIterator dans ma classe; j'ai du declarer un pointeur de cet attribut et faire une petite bidouille car un QListIterator n'est pas instanciable sans lui avoir passé en argument un Qlist... bref ensuite voila le probleme:
    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
     
    bool Dialog::listProcessing() {
      qDebug() << "begin of list processing...";
      QFile list(lineEdit->text());
      list.open(QIODevice::ReadOnly);
      QString line;
     
      while(1) {
        line = (QString)(list.readLine());
        if (line.isEmpty())
          break;
        if (line.startsWith("#image#")) {
          line.remove("#image#");
          file << line.trimmed();
        }
      }
      QListIterator<QString> i(file);
      iterator = &i;
      //iterator->next();
      print(iterator->next());
      qDebug() << "end of list processing!";
    }
     
    void Dialog::previous() {
      if (iterator->hasPrevious());
        print(iterator->previous());
    }
     
    void Dialog::next() {
      if (iterator->hasNext())
        print(iterator->next());
    }
    Dans ma fonction listProcessing() l'utilisation des iterator->next() fonctionnent à merveille (meme celui de la ligne commentée)... mais une fois rentré dans une des deux dernières fonctions: plantage et fermeture du programme sans afficher l'image suivante (ou precedente, selon le cas).
    Apres un petit debuggage, je me rend compte que l'utilisation de iterator->next() ou previous() ne fonctionne que dans listProcessing();

    Alors je fait appel à votre serviabilité... aidez moi svp.

    PS: list est un fichier ASCII qui contient deux chemin d'images chacun ecrit sur une ligne.

    N'hesitez pas si vous desirez plus d'info., merci par avance.

    Mac & Cheese
    World's greatest inventors: Franklin, Edison and this REESE guy.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    salut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
     QListIterator<QString> i(file);
      iterator = &i;
      //iterator->next();
      print(iterator->next());
      qDebug() << "end of list processing!";
    }
    a la sortie de cette fonction, i est detruit, donc iterator est un invalide.
    Pourquoi iterator est un pointeur????

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    Points : 96
    Points
    96
    Par défaut
    Tout d'abord, merci Mongaulois pour ta reponse.

    Ensuite, iterator est un pointeur car en realité, c'est un des attributs de ma classe Dialog donc je veux pouvoir l'utiliser dans toutes les fonctions appartenant à cette classe.

    La fonction listProcessing() est la premiere à etre lancée, elle initialise list (qui au passage est un attribut aussi), mais, à partir du moment ou j'utilise iterator en dehors de cette fonction, ça plante.iterator n'est pas detruit lui car cet un attribut, correct non?
    World's greatest inventors: Franklin, Edison and this REESE guy.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par mac&cheese Voir le message
    iterator n'est pas detruit lui car cet un attribut, correct non?
    oui mais iterator est un pointeur. c'est la zone ou il pointe qui est invalide car i as été detruit.
    Pourquoi utilise tu un pointeur?

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    Points : 96
    Points
    96
    Par défaut
    Ah quel idiot je suis...
    Effectivement, je comprend ce que tu veux dire.
    iterator est un pointeur car je n'arrive pas à l'instancier autrement.
    Le prototype du constructeur de QListIterator est: QListIterator(QList<type>&).
    Comment puis-je declarer un attribut QListIterator afin d'y acceder depuis n'importe quelle fonction de ma classe Dialog?

    Si tu desires jeter un coup d'oeil à mes sources, je te les donnes.

    Mac & Cheese
    World's greatest inventors: Franklin, Edison and this REESE guy.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    J'ai regardais un peu et les QList sont des java-style iterator et ne semble pas faire ce que tu veut.
    par contre tu as aussi les stl-style iterator
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QList<int> myList;
    QList<int>::iterator it;
    it = myList.begin();
    qu'es ce que tu veut faire 'en faite?

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    Points : 96
    Points
    96
    Par défaut
    Oui j'ai deja essayer les iterateurs stl-style, mais ce qui m'arrangeais dans le java-style, ce sont les fonctions hasNext() et hasPrevious().
    Je vais t'expliquer ce que je cherches à faire:
    Dans mon application j'ai besoin d'une visionneuse d'image, donc quand j'appui sur le bouton suivant, j'ai l'image suivante et l'image precedente grace au bouton precedent.Donc l'iterateur java-style me permettais de tester lorsque le bouton suivant (par exemple) est clicked() la presence d'un "maillon" suivant dans ma liste (qui est en realite un QStringList).

    En ce qui concerne le stl-style, je l'ai laissé tombé car il semble que j'ai un probleme lorsque je veux tester un maillon vide.
    par exemple if((file.at(iterator_stl)).isEmpty()), ne gère pas correctement la liste à mon gout, imaginons que le contenu d'un maillon soit remplacé par "".
    Et .isNull() plante mon programme.

    Je suis perdu, je ne sais pas vraiment comment m'y prendre.
    Aurais tu un conseil?
    Mon explication est-elle suffisamment claire?

    Mac & Cheese
    World's greatest inventors: Franklin, Edison and this REESE guy.

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((file.at(iterator_stl)).isEmpty())?
    ceci me parait mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (iterator_stl != file.end()  && iterator_stl->isEmpty())
    Sinon, la QList et un peu comme un vector. Pourquoi ne pas utiliser un indice?

    A toi de voir se que tu comprend le mieux
    bon courage

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    Points : 96
    Points
    96
    Par défaut
    Effectivement je n'avais pas vu la fonction end().

    Je te remercie encore une fois Mongaulois pour ton aide.

    Mac & Cheese
    World's greatest inventors: Franklin, Edison and this REESE guy.

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par mac&cheese Voir le message
    Effectivement je n'avais pas vu la fonction end().

    Je te remercie encore une fois Mongaulois pour ton aide.

    Mac & Cheese
    par contre je préfère te precisé que je ne connais pas trop les iterator de qt.Alors je peut me tromper...

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    Points : 96
    Points
    96
    Par défaut
    Voila ce que j'ai codé, par rapport à notre discussion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void Dialog::previous() {
      if (iterator != file.begin())
        print(*(--iterator));
      else
        qDebug() << "ok";
    }
     
    void Dialog::next() {
      if (iterator != file.end() )
        print(*(++iterator));
    }
    le programme ne passe jamais par le else, meme si je suis sur la premiere image et que j'appuie sur le bouton precedent.

    En revanche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void Dialog::previous() {
      if (!(iterator == file.begin()))
        print(*(--iterator));
      else
        qDebug() << "ok";
    }
     
    void Dialog::next() {
      if (!(iterator == file.end()))
        print(*(++iterator));
    }
    cela fonctionne à merveille...

    Rise and cheese
    World's greatest inventors: Franklin, Edison and this REESE guy.

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Attention y as de forte chance que l'ajout/le retrais d'un objet dans la liste invalide l'iterateur....
    http://qt.developpez.com/doc/latest/qlist.html#insert-2

    This is an overloaded member function, provided for convenience.

    Inserts value in front of the item pointed to by the iterator before. Returns an iterator pointing at the inserted item. Note that the iterator passed to the function will be invalid after the call; the returned iterator should be used instead
    .

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 98
    Points : 96
    Points
    96
    Par défaut
    Desole, j'ai modifié mon message pendant que tu repondais.

    Je ne touchais pas à ma liste, mais j'ai mis une solution qui fonctionne et je n'ai aucunes idées pourquoi l'une fonctionne et pas l'autre.

    Merci pour l'info sur l'ajout/retrait d'objet dans la liste.

    Mac & Cheese
    World's greatest inventors: Franklin, Edison and this REESE guy.

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

Discussions similaires

  1. comment recuperer attribut de type hidden
    Par MSM_007 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 19/07/2006, 13h04
  2. manipulation d'un champ de type Memo
    Par ivanleterrible dans le forum Bases de données
    Réponses: 6
    Dernier message: 29/05/2006, 22h53
  3. Réponses: 3
    Dernier message: 02/05/2006, 16h12
  4. probleme avec les attributs de type ID
    Par ben83 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 01/01/2006, 22h49
  5. Réponses: 3
    Dernier message: 20/09/2005, 09h59

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