2010-04-23 10 views
5

In uno dei miei progetti sto lavorando con un QTimer e mi chiedo se sia possibile ottenere il tempo rimanente di un QTimer per far sapere all'utente "Tempo fino al prossimo timeout: 10 secondi" o qualcosa del genere ... È possibile? Se così non fosse, ha qualche buona idea su come rendersene conto?Tempo rimanente di QTimer

Forse ho avuto modo di scrivere il mio timer ...

+0

C'è [REMAININGTIME] (http://qt-project.org/doc/qt-5.0/qtcore/qtimer.html#remainingTime-prop) property in Qt5 –

risposta

6

E 'questo quello che stai cercando? QTimer :: elapsed() utilizza l'orologio del computer, quindi a seconda della piattaforma la precisione varia.

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

Date un'occhiata alla manifestazione timerEvent da QObject. Penso che tu possa ottenere ciò che vuoi con questo.

3

Grazie per il vostro consiglio, ma ho trovato un'altra soluzione. Ho scritto la mia classe my_timer che ha semplicemente il timer secondario interno che scade ogni secondo. Nella mia finestra principale collego questo timeout con una funzione che aggiorna il display per l'utente.

Il 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(); 
} 

E nella mia 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

Non è un approccio negativo, ma se lo farai, ne incapsulerò di più nella classe my_timer. Ad esempio, avere un segnale ogni_second e un segnale di timeout finale, in modo che le classi che lo utilizzano non debbano ottenere il timer del notificatore e collegarsi ad esso. Puoi anche tenere traccia del tempo trascorso e del tempo rimanente in quella classe. –

1

abete ragioni di completezza:

#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_*/ 
Problemi correlati