Qt: Un widget qui affichera caractère par caractère (durée)
Bonjour,
Je suis une débutante en Qt et J’ai une partie d’un code qui doit récupérer une chaine de caractère ensuite je dois l’afficher caractère par caractère selon une vitesse définie, j’ai écrit la procédure en utilisant la fonction sleep ce qui a fonctionné dans le mode console, et maintenant j’ai besoin d’un widget qui va afficher la chaine caractère par caractère, j’ai essayé QListBox, plainTextEdit, QFormLayout QLineEdit.. Mais sans résultat, Et il semble aussi que sleep ne fonctionne pas en mode graph .
Aidez-moi s’il vous plait et merci d’avance.
Je suis une débutante en Qt et J’ai une partie d’un code qui doit récupérer une chaine de caractère ensuite je dois l’afficher caractère par caractère selon une vitesse définie, j’ai écrit la procédure en utilisant la fonction sleep ce qui a fonctionné dans le mode console, et maintenant j’ai besoin d’un widget qui va afficher la chaine caractère par caractère, j’ai essayé QListBox, plainTextEdit, QFormLayout QLineEdit.. Mais sans résultat, Et il semble aussi que sleep ne fonctionne pas en mode graph .
Aidez-moi s’il vous plait et merci d’avance.
1 réponse
-
Bonjour,
Qt (au même titre que n'importe quelle bibliothèque permettant de faire un interface graphique comme GTK ou tk) fonctionne de manière asynchrone, or raisonner avecsleep
revient à raisonner de manière synchrone. C'est donc inadapté. En asynchrone, on rattrape des événements, et en l'occurrence, il te faut quelque chose qui lève un événement à instant réguliers (par exemple chaque seconde).
En Qt, la classe qu'il te faut est probablementQTimer
. Dans l'exemple fourni, le timer expire toutes les secondes et déclenche un appel à la méthodeMyTimerSlot
de classeMyTimer
.
Il te suffirait donc d'en adapter le contenu de cette dernière méthode pour faire ce que tu veux (dans ton cas, afficher ta chaîne caractère par caractère).
Si je reprends cet exemple, ton code pourrait ressembler à :
MyTimer.hpp
#ifndef MYTIMER_H #define MYTIMER_H #include <string> // #include <QString> si tu préfères utiliser QString plutôt que std::string #include <QTimer> class MyTimer : public QObject { Q_OBJECT public: std::string message; // Ajout, tu peux aussi utiliser QString si tu préfères unsigned compteur; // Ajout MyTimer(const std::string & message); ~MyTimer(); // Manquant QTimer *timer; public slots: void MyTimerSlot(); }; #endif // MYTIMER_H
MyTimer.cpp
#include "MyTimer.hpp" #include <QDebug> // On adapte aussi le constructeur MyTimer::MyTimer(const std::string & message): message(message), compteur(0) { timer = new QTimer(this); connect(this->timer, SIGNAL(timeout()), this, SLOT(MyTimerSlot())); this->timer->start(1000); } MyTimer::~MyTimer(){ delete this->timer; // Manquant : qui dit new dit delete } void MyTimer::MyTimerSlot() // Adapté { qDebug() << this->message.substr(0, this->compteur); if (this->compteur < this->message.size()) { this->compteur++; } }
main.cpp
#include <QCoreApplication> #include "MyTimer.hpp" int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); MyTimer timer; return app.exec(); }
Note : je mets lesthis->
pour insister sur le fait que l'on parle d'un attribut de l'instance à laquelle la méthode considérée est appliquée, mais tu peux sous-entendre lesthis->
si c'est clair pour toi (c'est équivalent et plus concis).
Bonne chance