Utilisation simple d'un objet QTimer
Question
Créez un projet nommé appTimer disposant d'une IHM contenant :
Type d'élément | Nom dans le code | Info |
Bouton | pbSS | Bouton start/stop du timer |
Nombre LCD | lcdNumber | Affichage d'un nombre imitation LCD |
Ligne de texte | leInterval | Réglage de l'intervalle du timer |
et permettant :
De déclencher le timer lors de l'appui sur le bouton
pbSS
. Attention, le bouton ne peut être actif que si une durée cohérente (>500ms) est présente dans la ligne de texte.Le bouton
pbSS
est une bascule et se transforme en bouton stop pour arrêter le timer.Il n'est possible de changer l'intervalle du timer que s'il est arrêté.
Indice
Pour faire un bouton à bascule, servez vous du texte affiché dans le bouton pour connaître son état.
Pour activer ou désactiver un élément graphique, il existe la méthode setEnabled(bool)
. Le paramètre est true
pour activer l'élément ou false
pour le désactiver. Il reste visible.
Solution
Fichier capptimer.h
Par défaut, la classe Mainwindow
gère la fenêtre d'IHM principale. Nous la renommons pour l'appeler CAppTimer
. Ce n'est pas obligatoire.
namespace Ui {
class CAppTimer;
}
class CAppTimer : public QMainWindow
{
Q_OBJECT
public:
explicit CAppTimer(QWidget *parent = 0);
~CAppTimer();
private:
Ui::CAppTimer *ui;
QTimer *timer;
double cpt;
private slots:
void onTimeout();
void on_pbSS_clicked();
};
// CAPPTIMER_H
Le fichier capptimer.cpp
CAppTimer::CAppTimer(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::CAppTimer)
{
ui->setupUi(this);
timer = new QTimer(this);
timer->setInterval(1000);
connect(timer, SIGNAL(timeout()), this, SLOT(onTimeout()));
cpt = 0;
}
CAppTimer::~CAppTimer()
{
delete timer;
delete ui;
}
void CAppTimer::onTimeout()
{
cpt++;
ui->lcdNumber->display(cpt);
}
void CAppTimer::on_pbSS_clicked()
{
if (ui->pbSS->text() == "Start") {
timer->start(ui->leInterval->text().toInt());
ui->leInterval->setEnabled(false);
ui->pbSS->setText("Stop");
} else {
timer->stop();
ui->leInterval->setEnabled(true);
ui->pbSS->setText("Start");
} // else
}