2010-04-23 32 views
5

Trong một dự án của tôi, tôi đang làm việc với QTimer và tôi tự hỏi liệu có thể lấy thời gian còn lại của QTimer để cho người dùng biết "Thời gian cho đến lần sau: 10 giây" hay không một cái gì đó như thế ... Có thể không? Nếu không như vậy, có ai có ý tưởng tốt để làm thế nào để nhận ra điều đó?Thời gian còn lại của QTimer

Có lẽ tôi phải viết thư hẹn giờ của riêng tôi ...

+0

Có [REMAININGTIME] (http://qt-project.org/doc/qt-5.0/qtcore/qtimer.html#remainingTime-prop) tài sản trong Qt5 –

Trả lời

6

Đây có phải là những gì bạn đang tìm kiếm? QTimer :: elapsed() sử dụng đồng hồ máy tính để tùy thuộc vào nền tảng của bạn độ chính xác thay đổi.

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

Có một cái nhìn vào sự kiện timerEvent từ QObject. Tôi nghĩ rằng bạn có thể đạt được những gì bạn muốn với điều này.

3

Cảm ơn lời khuyên của bạn, nhưng tôi đã tìm thấy một giải pháp khác. Tôi đã viết my_timer lớp của riêng tôi mà chỉ đơn giản là có nó trên bộ đếm thời gian nội bộ thứ hai người ra mỗi giây. Trong cửa sổ chính của tôi, tôi kết nối thời gian chờ này với chức năng cập nhật hiển thị cho người dùng.

Các 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(); 
} 

Và trong main_window.cpp tôi:

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

Không phải là một cách tiếp cận xấu, nhưng nếu bạn đang đi để làm điều này, tôi sẽ đóng gói nhiều hơn của nó vào lớp my_timer. Ví dụ, có một tín hiệu every_second và tín hiệu final_timeout, để các lớp của bạn sử dụng nó không cần phải lấy bộ đếm thời gian thông báo và kết nối với nó. Bạn cũng có thể theo dõi thời gian trôi qua và thời gian còn lại trong lớp đó. –

1

linh sam vì lợi ích của sự hoàn chỉnh:

#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_*/ 
Các vấn đề liên quan