2010-04-23 3 views
5

Dans l'un de mes projets, je travaille avec un QTimer et je me demande s'il est possible d'obtenir le temps restant d'un QTimer pour indiquer à l'utilisateur "Time to next timeout: 10 secs" ou quelque chose comme ça ... Est-ce possible? Si ce n'est pas le cas, y a-t-il de bonnes idées pour réaliser cela?Temps restant de QTimer

Peut-être que je suis arrivé à écrire mon propre minuterie ...

+0

Il est [remainingTime] (http://qt-project.org/doc/qt-5.0/qtcore/qtimer.html#remainingTime-prop) propriété dans Qt5 –

Répondre

6

Est-ce que vous cherchez? QTimer :: elapsed() utilise l'horloge des ordinateurs, donc en fonction de votre plateforme, la précision varie.

class MyTimer : QTimer 
{ 
    MyTimer(QObject* parent) : QTimer(parent) 
    { 
     connect(this, timeout(), this, resettime()); 
    } 

    int start() 
    { 
     m_time.start(); 
     return QTimer::start(); 
    } 

    int start(int msec) 
    { 
     m_time.start(); 
     return QTimer::start(msec)l 
    } 


    int timeLeft() 
    { 
     return interval()-m_time.elapsed() 
    } 

    private slots: 

    void resettime() 
    { 
     m_time.restart(); 
    } 

    private: 
    QTime m_time; 
} 
2

Jetez un oeil à l'événement timerEvent de QObject. Je pense que vous pouvez réaliser ce que vous voulez avec cela.

3

Merci pour votre conseil, mais j'ai trouvé une autre solution. J'ai écrit ma propre classe, my_timer, qui a simplement une minuterie secondaire interne qui expire toutes les secondes. Dans ma fenêtre principale je connecte ce timeout avec une fonction avec des mises à jour de l'affichage pour l'utilisateur.

Le my_timer.cpp:

#include "my_timer.hpp" 

my_timer::my_timer(QWidget *parent) : QTimer(parent) 
{ 
    notifier = new QTimer; 
} 

my_timer::~my_timer() 
{ 
    //... 
} 

QTimer* my_timer::get_notifier() 
{ 
    return notifier; 
} 

void my_timer::start(int msec) 
{ 
    QTimer::start(msec); 
    notifier->start(1000); 
} 

void my_timer::stop() 
{ 
    QTimer::stop(); 
    notifier->stop(); 
} 

Et dans mon main_window.cpp:

void main_window::setup_connects() 
{ 
     // ... 
    connect(m_timer->get_notifier(), SIGNAL(timeout()), this, SLOT(on_update_label())); 
     // ... 
} 

void main_window::on_update_label() 
{ 
    if(m_timer->isActive()) 
    { 
     if(remaining_secs > 1) 
     { 
      remaining_secs--; 
     } 
     else 
     { 
      remaining_secs = spin_box->value(); 
     } 

     update_label(); 
    } 
} 

void main_window::update_label() 
{ 
    m_time_string = QString("Remaining time until next execution: %1").arg(remaining_secs); 
    m_time_label->setText(m_time_string); 
} 
+1

Pas une mauvaise approche, mais si vous allez faire cela, je voudrais en encapsuler plus dans la classe my_timer. Par exemple, ayez un signal every_second et un signal final_timeout, afin que vos classes qui l'utilisent n'aient pas besoin d'obtenir le timer du notificateur et de s'y connecter. Vous pouvez également suivre le temps passé et le temps restant dans cette classe. –

1

sapin par souci d'exhaustivité:

#ifndef _ELAPSED_TIMER_H_ 
#define _ELAPSED_TIMER_H_ 

#include <QTimer> 
#include <QTime> 

/* 
* convenience class, which can return the proportion of the time left. usefull for interpolation 
* tasks 
**/ 
class ElapsedTimer : public QTimer 
{ 
    Q_OBJECT 

    public: 
     ElapsedTimer(QObject* parent) : QTimer(parent) 
     { 
      connect(this, SIGNAL(timeout()), this, SLOT(resettime())); 
     } 

     void start() 
     { 
      m_time.start(); 
      QTimer::start(); 
     } 

     void start(int msec) 
     { 
      m_time.start(); 
      QTimer::start(msec); 
     } 

     double proportionLeft() 
     { 
      return (interval()-m_time.elapsed())/interval(); 
     } 

     int timeLeft() 
     { 
      return interval()-m_time.elapsed(); 
     } 

    private slots: 

     void resettime() 
     { 
      m_time.restart(); 
     } 

    private: 
     QTime m_time; 
}; 

#endif/*_ELAPSED_TIMER_H_*/ 
Questions connexes