Qt中使用定時器(可使用QObject::timerEvent定時執行,QTimer::singleShot可只觸發一次)

在Qt中使用定時器有兩種方法,一種是使用QObiect類的定時器;一種是使用QTimer類。定時器的精確性依賴於操作系統和硬件,大多數平臺支持20ms的精確度

1.QObject類的定時器

    QObject是所有Qt對象的基類,它提供了一個基本的定時器。通過QObject::startTimer(),可以把一個一毫秒爲單位的時間間隔作爲參數來開始定時器,這個函數返回一個唯一的整數定時器的標識符。這個定時器開始就會在每一個時間間隔"觸發",直到明確的使用這個定時器的標識符來調用QObject::killTimer()結束。
    當定時器觸發時,應用程序會發送一個QTimerEvent。在事件循環中,處理器按照事件隊列的順序來處理定時器事件。當處理器正忙於其它事件處理時,定時器就不能立即處理。
    QObject類還提供定時期的功能。與定時器相關的成員函數有:startTimer()、timeEvent()、killTimer()。QObject基類中的startTimer()和timerEvent()原型及說明如下:

int QObject::startTimer(int interval);

    開始一個定時器並返回定時器ID,如果不能開始一個定時器,將返回0。定時器開始後,每隔interval毫秒間隔將觸發一次超時事件,直到killTimer()被調用來刪除定時器。如果interval爲0,那麼定時器事件每次發生時沒有窗口系統事件處理。

virtual void QObject::timerEvent(QTimerEvent *event);

    虛函數timerEvent()被重載來實現用戶的超時事件處理函數。如果有多個定時器在運行,QTimerEvent::timerId()被用來查找指定定時器,對其進行操作。
    當定時器事件發生時,虛函數timerEvent()隨着QTimerEvent事件參數類一起被調用,重載這個函數可以獲得定時器事件。

    定時器的用法如下:

//頭文件
class QNewObject : public QObject
{
    Q_OBJECT
public:
    QNewObject( QObject * parent = 0 );
    virtual ~QNewObject();

protected:
    void timerEvent( QTimerEvent *event );
    int m_nTimerId;
};

//源文件
QNewObject::QNewObject( QObject * parent )
    :QNewObject( parent )
{
    m_nTimerId = startTimer(1000);
}

QNewObject::~QNewObject()
{
    if ( m_nTimerId != 0 )
        killTimer(m_nTimerId);
}

void QNewObject::timerEvent( QTimerEvent *event )
{
    qDebug( "timer event, id %d", event->timerId() );
}

2.定時器類QTimer

 定時器類QTimer提供當定時器觸發的時候發射一個信號的定時器,他提供只觸發一次的超時事件,通常的使用方法如下:
//創建定時器
QTimer *testTimer = new QTimer(this);
//將定時器超時信號與槽(功能函數)聯繫起來
connect( testTimer, SIGNAL(timeout()), this, SLOT(testFunction()) );
//開始運行定時器,定時時間間隔爲1000ms
testTimer->start(1000);
...
//停止運行定時器
if ( testTimer->isActive() )
    testTimer->stop();

  QTimer還提供了一個簡單的只有一次定時的函數singleShot()。 一個定時器在100ms後觸發處理函數animateTimeout()並且只觸發一次。代碼如下:

QTimer::singleShot( 100, this, SLOT(animateTimeout()) );

QTimer類提供了定時器信號和單觸發定時器。

 

它在內部使用定時器事件來提供更通用的定時器。QTimer很容易使用:創建一個QTimer,使用start()來開始並且把它的timeout()連接到適當的槽。當這段時間過去了,它將會發射timeout()信號。

注意當QTimer的父對象被銷燬時,它也會被自動銷燬。

實例:

QTimer *timer = new QTimer( myObject ); connect( timer, SIGNAL(timeout()), myObject, SLOT(timerDone()) ); timer->start( 2000, TRUE ); // 2秒單觸發定時器

你也可以使用靜態的singleShot()函數來創建單觸發定時器。

作爲一個特殊情況,一旦窗口系統事件隊列中的所有事件都已經被處理完,一個定時爲0的QTimer就會到時間了。

這也可以用來當提供迅速的用戶界面時來做比較繁重的工作。

QTimer *t = new QTimer( myObject ); connect( t, SIGNAL(timeout()), SLOT(processOneThing()) ); t->start( 0, FALSE );

myObject->processOneThing()將會被重複調用並且應該很快返回(通常在處理一個數據項之後),這樣Qt可以把事件傳送給窗口部件並且一旦它完成這個工作就停止這個定時器。這是在圖形用戶界面應用程序中實現繁重的工作的一個典型方法,現在多線程可以在越來越多的平臺上使用,並且我們希望無效事件最終被線程替代。

注意QTimer的精確度依賴於底下的操作系統和硬件。絕大多數平臺支持20毫秒的精確度,一些平臺可以提供更高的。如果Qt不能傳送定時器觸發所要求的數量,它將會默默地拋棄一些。

另一個使用QTimer的方法是爲你的對象調用QObject::startTimer()和在你的類中(當然必須繼承QObject)重新實現QObject::timerEvent()事件處理器。缺點是timerEvent()不支持像單觸發定時器或信號那樣的高級水平。

一些操作系統限制可能用到的定時器的數量,Qt會盡力在限制範圍內工作。

發佈了34 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章