2012-08-10 63 views

回答

3

您可以使用QTimeQElapsedTimer,但他們不是QObject S,所以你需要來包裝他們在一個QObject類,如果你需要能夠通過Qt的信號來啓動和停止它們。

class Timer : public QObject { 
    Q_OBJECT 
public: 
    explicit Timer(QObject *parent = 0): QObject(parent) {}  
public slots: 
    void start() { 
     time.start(); 
    } 
    void stop() { 
     emit elapsed(time.elapsed()); 
    } 
signals: 
    void elapsed(int msec); 
private: 
    QTime time;  
}; 
+0

我該怎麼做?我是否需要創建一個繼承qelapsed時間並定義stop()函數的新類? – Frank 2012-08-10 13:07:33

+0

我會遵循「繼承的組合」規則,並使QElapsedTimer成爲基於QObject的包裝的成員。如果你需要的話 - 我沒有看到你的問題直接需要。 – 2012-08-10 13:27:58

+0

我很抱歉,但我沒有明白你的意思。你能舉一個例子說明我能如何以這種方式阻止QElapsedTimer? – Frank 2012-08-10 13:58:38

0

請看看下面這個例子,並在類QTimer

//This class will inherit from QTimer 
class Timer : public QTimer 
{ 
    //We will count all the time, that passed in miliseconds 
    long timePassed; 

    Q_OBJECT 

    public: 

    explicit Timer(QObject *parent = 0) : QTimer(parent) 
    { 
     timePassed = 0; 
     connect(this, SIGNAL(timeout()), this, SLOT(tick())); 
    } 
    private slots: 

    //this slot will be connected with the Timers timeout() signal. 
    //after you start the timer, the timeout signal will be fired every time, 
    //when the amount interval() time passed. 
    void tick() 
    { 
     timePassed+=interval(); //we increase the time passed 
     qDebug()<<timePassed; //and debug our collected time 
    } 
}; 

在主應用程序:

Timer * timer = new Timer(this); 
timer->setInterval(1000); 
timer->start(); 

這將創建一個Timer對象,設置其時間間隔到1秒,然後啓動它。您可以根據需要將盡可能多的插槽連接到timeout()信號,也可以創建自定義信號。您可以通過timer->stop();

停止定時器,我希望它能幫上忙!

+1

對於我來說,這比QTime/QElapsedTimer方法更復雜,也不太準確(不能保證在間隔()後精確調用計時器插槽 - 例如,如果另一個事件處理程序需要很長時間)。 – 2012-08-10 13:26:36