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 :

QLineEdit auto-complétion via QCompleter modele MVC


Sujet :

Qt

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 39
    Points
    39
    Par défaut QLineEdit auto-complétion via QCompleter modele MVC
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class A : public QObject
    {
        Q_OBJECT
     
        private:
            B* b;
            QLineEdit* lineEdit;
        public:
            //
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class B : public QObject
    {
        Q_OBJECT
     
        private:
            A* a;
            QHttp http;
        private slots:
    	void requeteDone(bool);
        public:
            //
    };
    L'objet de type A possède une méthode qui est appelé lorsque qu'un QLineEdit est modifié. Dans le slot ainsi appelé, je récupère le contenu saisi.
    J'utilise une méthode de mon objet b de type B qui par un attribut QHttp envoie une requete http en get.
    "get" est une méthode asynchrone qui rend immédiatement la main.
    J'utilise le signal émis par mon objet QHttp : done(bool) pour savoir quand la requete peut être traitée. Je crée via la source récupérée une QStringList.

    Mon problème :

    mon objet B contient donc une QLineEdit, à laquelle je veux affecter un QCompleter. J'aimerai utiliser l'architecture MVC, enfin plutôt MV avec Qt, pour auto compléter mon QLineEdit. Ce que j'ai testé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class A : public QObject
    {
        Q_OBJECT
     
        private:
            B* b;
            QCompleter* completer;
            QStringListModel* listModel;
            QStringList list;
        public:
            void setList(QStringList newList);
    };
    Dans le constructeur de ma classe A :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    listModel = new QStringListModel(list, this);
    completer = new QCompleter(listModel);
    this->lineEdit->setCompleter(completer);

    Une fois que 'a' a créé la QStringList qui m'intéresse, je fais En théorie, j'ai compris que lorsqu'on modifie le modele d'un MVC, la vue doit alors être modifiée... Or dans mon cas, le QCompléter ne s'actualise pas et à therme ne s'afiche JAMAIS...

  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.
    AUrais tu un code un peu plus complet??
    que fait

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 39
    Points
    39
    Par défaut
    Désolé pour le manque de code, j'ai deux classes assez grosse, j'ai voulu faire un condensé... Ma méthode setListe permet d'affecter à la QStringList de mon objet a de type A la QStringList créée dans une méthode de mon objet b...

    [EDIT] Au lieu de setter simplement la nouvelle QStringList, j'ai joué cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      listModel = new QStringListModel(liste, this);
      this->complete->setModel(listModel);
    J'ai eu une mini amélioration, la listbox d'auto-complétion s'affiche quand j'ai tapé 3 caractères (car je fais la recherche partir de 2 caractères) et fait UN backspace mais disparait tel un éclair...

    Du nouveau quand je vire du constructeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    listModel = new QStringListModel(liste, this);
    this->complete->setModel(listModel);
    L'auto complétion apparait/disparait mais à chaque caractère entré, plus besoin de faire de backspace pour voir le phénomène... :S aidez-moi par pitié
    [/EDIT]

  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
    Met tu à jour ton completer??
    AS tu regardé les example de Qt?

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Met tu à jour ton completer??
    Non pas directement, je mets à jour l'objet QStringListModel euh non je mets à jour ma QStringList...
    Citation Envoyé par Mongaulois Voir le message
    AS tu regardé les example de Qt?
    Oui bien sur, je ne me serai pas permis de poster sans avoir fait cela...

  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
    sans plus de code, ca va être difficile de t'aider.
    Peux tu faire un exemple simple compilable??

  7. #7
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 39
    Points
    39
    Par défaut
    Après avoir refait le schéma en supprimant ce qui était non impliqué à la complétion, je me suis plus rendu compte que je ne suis pas capable de faire un objet qui est un référence sur un autre objet...

    Pour le moment je vais regrouper mes deux classes en une seule. Et pour la complétion, mon teste fonctionnait quand je créais une nouvelle liste puis je suis obligé de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void A::setListe(QStringList newListe)
    {
          model = new QStringListModel(newListe, this);
          this->comp->setModel(model);
    }
    Etrange à mon goût car je pensais que le MVC permettais de simplifier les choses, et donc de modifier la Vue uniquement en modifiant le Model soit la liste contenu dans ce model... Si quelqu'un trouve mon erreur et si ma visoion des choses est erronée, merci de me remettre sur le droit chemin

    Ci joint le code du programme simplifié qui fonctionne...
    Fichiers attachés Fichiers attachés

  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
    Citation Envoyé par jerem59300 Voir le message
    Après avoir refait le schéma en supprimant ce qui était non impliqué à la complétion, je me suis plus rendu compte que je ne suis pas capable de faire un objet qui est un référence sur un autre objet...

    pourquoi??

  9. #9
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 39
    Points
    39
    Par défaut
    ^^ J'ai appris entre temps... le code que j'ai déposé utilise les références...

    J'ai trouvé LE problème... quand je set la nouvelle liste via une méthode le QCompleter ne disparait pas a chaque nouveau caractère, par contre quand je passe par le slot connecté au signal done renvoyé par la fonction asynchrone get de l'objet http de type QHttp le QCompleter... disparait... :'(

    Quelqu'un sait traiter ce phénomène... j'essaie encore d'autres choses... Dès que j'ai une nouvelle donnée je la poste...

  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
    Salut,
    attention, tu ne detruit pas ton QHttp et QBuffer.
    sinon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void A::setListe(QStringList _liste)
    {
    	cout << "liste : " << _liste.size() << endl;
    	cout << "debug" << endl;
    	model = new QStringListModel(_liste, this);
    	comp->setModel(model);
    	comp->complete();
    }
    Comme tu modifie le model, il faut lui dire de refaire la complétion

  11. #11
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 39
    Points
    39
    Par défaut
    Effectivement j'ai omis le destructeur de la classe B afin de faire un delete de buffer et de http...

    Par contre le comp->complete() ne change pas le problème... As-tu compilé mon code et vu une différence?

    J'ai modifié quelque chose :

    ce morceau de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    model = new QStringListModel(liste, this);
    this->comp->setModel(model);
    comp->complete();
    je l'ai déplacé... Je l'ai replacé dans la méthode request de la classe A... Le comportement de l'application est différente... Actuellement, la liste est mis à jour quand je tape 5 lettres ou si je fais un backspace... Je suis assez perplexe quant au fonctionnement de ces objets...


    J'ai compris pour le QCompleter fonctionne uniquement après avoir rentré plusieurs lettre c'est parce que comme j'ai déplacé la mise en place du model alors si la réponse est trop longue, il va setter le modèle avant que la requête envoie le signal done... Je dois donc remettre l'affectation du nouveau modèle dans la méthode setListe appelé par le slot done... et miracle je viens de compiler et d'exécuter... ca ROX !! Mais pourquoi maintenant... peut etre le comp->complete() qui change tout ! Je l'enlève pour tester... et oui c'était cela !!

    Un grand merci Mongaulois !! Je n'ai plus qu'à transférer cela dans mon programme...

    [EDIT] j'allais oublié... pourquoi l'architecture MVC ne permet pas de mettre à jour la vue en modifiant uniquement la liste "connecté" au modèle...? ce n'est pas le but ?[/EDIT]

  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
    Citation Envoyé par jerem59300 Voir le message
    Par contre le comp->complete() ne change pas le problème... As-tu compilé mon code et vu une différence?
    ben oui... et sa marche

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

Discussions similaires

  1. [Edition] Auto Complétion tout le temps
    Par Tourix dans le forum Eclipse Java
    Réponses: 9
    Dernier message: 21/08/2008, 10h25
  2. [PHP-JS] Auto-complétion [Ajax,PHP & MySQL]
    Par xdiethank dans le forum Langage
    Réponses: 4
    Dernier message: 21/07/2006, 16h18
  3. [Design Pattern]Respecter le modèle MVC
    Par etiennegaloup dans le forum Général Java
    Réponses: 2
    Dernier message: 16/10/2005, 13h00
  4. Auto-complétion pour les mots clés Begin/End
    Par Alex Laforest dans le forum EDI
    Réponses: 2
    Dernier message: 21/09/2005, 22h26
  5. [Design Pattern] Modele MVC
    Par unNew dans le forum Général Java
    Réponses: 27
    Dernier message: 01/09/2005, 01h37

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