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.
A voir également:
- Afficher caractères non imprimables google doc
- Qt sdk - Télécharger - Langages
- Qt web - Télécharger - Navigateurs
- Qt tab bar - Télécharger - Personnalisation
- Qt linux ✓ - Forum Ubuntu
- QT sous windows ✓ - Forum Programmation
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 avec
En Qt, la classe qu'il te faut est probablement
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
MyTimer.cpp
main.cpp
Note : je mets les
Bonne chance
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 avec
sleeprevient à 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 probablement
QTimer. Dans l'exemple fourni, le timer expire toutes les secondes et déclenche un appel à la méthode
MyTimerSlotde classe
MyTimer.
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 les
this->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 les
this->si c'est clair pour toi (c'est équivalent et plus concis).
Bonne chance