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

Discussion :

Rafraichissement d'une QTextEdit

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2018
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2018
    Messages : 124
    Points : 55
    Points
    55
    Par défaut Rafraichissement d'une QTextEdit
    Bonjour à tous,

    j'ai créé une QTextEdit, dans laquelle je viens mettre du texte, en utilisant le "append". Le problème est que tout le texte s'affiche qu'une seule fois, lorsqu'il sort de ma fonction et non au fur et à mesure.

    Il y a-t-il un moyen pour forcer l'affichage en cours ?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Tu peux, au besoin, faire explicitement appel à la fonction update() de ton widget -- quel qu'il soit -- pour forcer la mise à jour de son contenu.

    Cependant, il faut bien te dire que le processus de mise à jour que cela implique peut -- selon le cas -- prendre énormément de temps (par exemple, quand l'élément à mettre a jour est en réalité une collection d'autres éléments), et que cela peut donc très fortement ralentir la réaction de ton interface.

    Il faut donc être particulièrement prudent quant à l'endroit où tu impose la mise à jour de ton / tes widget(s), pour que cela puisse se faire "assez souvent" à ton gout, sans pour autant en arriver à se faire "tellement souvent que cela empêche quoi que ce soit d'autre" de se faire

    En outre, il faut réfléchir à la raison de la mise à jour de ton widget. Il n'y a -- à mon sens du moins -- aucune raison pour provoquer l'affichage "mot à mot" de ton QTextEdit lorsque tu en provoque le remplissage avec "le texte de base" ou lorsque tu y fais un copier / coller. A moins -- bien sur -- que le texte à afficher soit particulièrement long (équivalent à plusieurs pages) et que le remplissage prenne "énormément" de temps.

    L'un dans l'autre, il est sans doute préférable de corriger ta logique d'ajout de manière à la rendre plus rapide plutôt que de ralentir encore d'avantage l'ensemble du processus en forçant la mise à jour de l'affichage pour te donner l'impression que "l'application travaille".

    Au pire, s'il y a vraiment de trop longs délais, "incompressibles" (comprends : dont il est impossible d'améliorer d'avantage la logique pour réduire le temps de travail), tu aurais -- peut-être -- intérêt à mettre en place une "animation quelconque" qui indique à l'utilisateur que l'application est occupée à travailler, voire, qui indique l'état de la progression (une QProgressBar, peut-être )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2018
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2018
    Messages : 124
    Points : 55
    Points
    55
    Par défaut
    Merci Koala01 pour ta réponse, je t'explique ce que je fais et tu pourras m'aiguiller dans ce cas.
    sur mon IHM j'ai un bouton, lorsque j’appuie sur le bouton, j'ouvre un port de com et j'affiche dans ce fameux QTextEdit tout ce que je reçois. mais tout le long de la transmission, le QTextEdit, n'affiche rien, surement parce qu'il est toujours dans la fonction qui reçoit et affiche les données.
    Je ne vais avoir l'affichage qu'une seul fois que mon code sort de cette fameuse fonction.

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2018
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2018
    Messages : 124
    Points : 55
    Points
    55
    Par défaut
    Je viens de faire un essai :
    ui->QtextEdit->update();

    mais ça n'est pas mieux, je n'ai pas d'affichage, enfin seulement à la fin.

    Est-ce bien ce update que tu m'as conseillé ?

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Avec un peu de code, ce serait surement plus facile pour t'aiguiller

    Mais, selon l'explication que tu en donnes, j'aurais tendance à dire que tu dois forcer la mise à jour à chaque fois qu'une "frame" a été reçue et correctement traitée.

    De prime abord, tu as sans doute un slot qui est connecté au signal clicked (ou triggered) de ton QPushButton, qui pourrait ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void TaClasse::onButtonPushed(){
     
        while(m_receptionActive){ // parce que tu veux que le premier clique provoque la réception
                                  // et que le deuxième l'arrête
            auto frame = getFrame(); // on récupère la frame en cours
                                     // C++11 inside : frame devrait idéalement être de type QString
            m_text->appendPlainText(frame);
            /* nota : selon le cas, ce sera peut-être
            m_text->appendHtml(frame);
            */
        }
    }
    Si cela ne suffit pas à provoquer la mise à jour, tu peux ajouter, juste après l'instruction append, l'émission du signal textChanged() (à l'intérieur de la boucle, mais comme dernière instruction de celle-ci), qui devrait suffire à provoquer la mise à jour de ton widget.

    Au pire, si cela ne suffit pas, tu peux envisager de forcer l'application à traiter tous les événements sous la forme d'une instruction QCoreApplication::processEvents(); (à l'intérieur de la boucle, mais, comme dernière instruction de celle-ci).
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2018
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2018
    Messages : 124
    Points : 55
    Points
    55
    Par défaut
    Tu me conseille de tester avec la fonction "appendPlainText", mais elle n'existe pas pour QTextEdit.
    Par contre "QCoreApplication::processEvents();" fonctionne très bien, mais j'ai peur que ce soit gourmand en CPU.

    Dans tout les cas, merci pour ton aide

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Amfrey95 Voir le message
    Je viens de faire un essai :
    ui->QtextEdit->update();

    mais ça n'est pas mieux, je n'ai pas d'affichage, enfin seulement à la fin.

    Est-ce bien ce update que tu m'as conseillé ?
    Au temps pour moi...

    Je t'avais bien conseillé update(), mais, de fait, je m'étais gourru : la fonction update() ne fait en réalité que marquer le widget comme "devant être mis à jour" lorsque l'on retourne dans la boucle principale de l'application.

    L'alternative qui provoquerait la mise à jour immédiate du widget est la fonction (le slot) repaint(), mais il s'agit d'en faire un usage très prudent pour ne pas entrer dans une récursivité de mauvais aloi

    Citation Envoyé par Amfrey95 Voir le message
    Tu me conseille de tester avec la fonction "appendPlainText", mais elle n'existe pas pour QTextEdit.
    Au temps pour moi : appendPlainText est une fonction membre de ... QPlainTextEdit et non de QTextEdit

    C'est bel et bien la fonction append() de QTextEdit qu'il te faut utiliser...

    Voici exactement la démonstration de tous les problèmes que l'on peut rencontrer lorsque l'on est trop sur de soi et que l'on ne prend pas le temps de tester le code que l'on présente

    Si j'avais ne serait-ce qu'essayé de compiler le code que je te présentais, je me serais directement rendu compte que appendPlainText n'existait pas pour QTextEdit, et, partant de là, je me serais sans doute rendu compte que je vérifiais la documentation de ... QPlainTextEdit

    Mais, quoi qu'il en soit, une fois que tu as fait ton ajout (quelle que soit la manière dont tu t'y prend, en fonction du widget que tu utilises), l'idée sera toujours de forcer la mise à jour du widget, que ce soit limité au widget (au travers de l'appel à repaint(), en tenant compte des problèmes que cela peut engendrer) ou pour l'ensemble de l'interface (au travers de QCoreApplication::processEvents() ).

    Par contre "QCoreApplication::processEvents();" fonctionne très bien, mais j'ai peur que ce soit gourmand en CPU.
    A priori, tu n'as pas trop à t'en faire à ce sujet là, car processEvents() va "se contenter" de traiter les événements qui sont entrés "dans le pipe" depuis la dernière fois qu'elle aura été exécutée (que ce soit de manière automatique ou forcée comme dans le cas présent).

    Or, a priori, en dehors de la nécessité de remettre le widget à jour, il n'y aurait que les événements liés à la gestion du clavier et de la souris qui auraient eu le temps d'y entrer (clique sur le bouton de sortie ou sur le bouton d'arrêt de la récupération des données, par exemple). Et ces événements ne devraient pas prendre énormément de temps à être traités

    Le problème serait sans doute tout autre si tu souhaitais mettre une QGraphicsView, composée de nombreux QGraphicsItem à jour, mais, dans le cas présent, on est très loin d'une situation pareille
    Dans tout les cas, merci pour ton aide
    Fourni avec plaisir
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2018
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2018
    Messages : 124
    Points : 55
    Points
    55
    Par défaut
    Koala01, je te confirme que ce coup-ci "repaint" fonctionne très bien aussi. Et je pense que je vais rester sur le "repaint" plutôt que sur "QCoreApplication::processEvents()".
    Dans tous les cas, merci beaucoup pour ton aide précieuse.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/06/2014, 21h13
  2. Rafraichissement d'une zone de texte
    Par chabs dans le forum MFC
    Réponses: 1
    Dernier message: 07/05/2005, 17h23
  3. Rafraichissement d'une fenêtre.
    Par GETah dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 21/04/2005, 09h33
  4. Showmodal puis rafraichissement d'une table
    Par navis84 dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/03/2005, 08h09
  5. [MFC] probleme de rafraichissement d'une image
    Par Vestaproman dans le forum MFC
    Réponses: 6
    Dernier message: 09/01/2004, 23h59

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