Qt: Un widget qui affichera caractère par caractère (durée)

Fermé
isane_8166 Messages postés 3 Date d'inscription samedi 5 juin 2021 Statut Membre Dernière intervention 14 juin 2022 - 14 juin 2022 à 00:48
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 - 29 juin 2022 à 15:55
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.
A voir également:

1 réponse

mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
Modifié le 29 juin 2022 à 16:01
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
sleep
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 probablement
QTimer
. Dans l'exemple fourni, le timer expire toutes les secondes et déclenche un appel à la méthode
MyTimerSlot
de 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
0