QObject 是所有 Qt 對象的基類,在 Qt 中提供基本計時器支持。采用 QObject::startTimer (),啓動計時器采用以毫秒為單位的間隔作為自變量。函數返迴唯一整數計時器 ID。現在將按定期間隔激發計時器,直到明確調用 QObject::killTimer () 采用計時器 ID。
要使此機製工作,必須在事件循環中運行應用程序。啓動事件循環采用 QApplication::exec ()。當計時器激發時,應用程序發送 QTimerEvent ,並控製流離開事件循環,直到計時器事件被處理。這隱含計時器無法被激發,當應用程序忙於做某些事情時。換句話說:計時器精度從屬應用程序的粒度。
在多綫程應用程序中,可以在任何擁有事件循環的綫程中使用計時器機製。要從非 GUI 綫程啓動事件循環,使用 QThread::exec ()。Qt 使用對象的 綫程親緣關係 確定哪個綫程將交付 QTimerEvent 。因此,必須啓動和停止對象綫程中的所有計時器;為另一綫程中的對象啓動計時器,是不可能的。
間隔值上限可以按有符號整數指定的毫秒數確定 (實踐中,此周期僅僅 24 天多一點)。精度從屬底層操作係統。Windows 2000 擁有 15 毫秒精度;測試過的其它係統,可以處理 1 毫秒間隔。
計時器功能的主要 API 是 QTimer 。該類提供發射信號的常規計時器當計時器被激發時,且繼承 QObject so that it fits well into the ownership structure of most GUI programs. The normal way of using it is like this:
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(updateCaption()));
timer->start(1000);
The QTimer object is made into a child of this widget so that, when this widget is deleted, the timer is deleted too. Next, its timeout() 信號將被連接到履行工作的槽,按 1000 毫秒值啓動,指示它將每秒超時。
QTimer 還為單發計時器提供靜態函數。例如:
QTimer::singleShot(200, this, SLOT(updateCaption()));
200 毫秒 (0.2 秒) 後執行此行代碼,
updateCaption()
槽將被調用。
For QTimer 要工作,應用程序必須擁有事件循環;也就是說,必須調用 QCoreApplication::exec () 在某些地方。纔交付計時器事件,當事件循環在運行時。
在多綫程應用程序中,可以使用 QTimer 在擁有事件循環的任何綫程中。要從非 GUI 綫程啓動事件循環,使用 QThread::exec ()。Qt 使用計時器的 綫程親緣關係 確定哪個綫程將發射 timeout() 信號。因此,必須在其綫程中啓動和停止計時器;從另一綫程啓動計時器,是不可能的。
The
指針式時鍾
範例展示如何使用
QTimer
以按定期間隔重新繪製 Widget。來自
AnalogClock
的實現:
AnalogClock::AnalogClock(QWidget *parent) : QWidget(parent) { QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(update())); timer->start(1000); ... }
每秒, QTimer 會調用 QWidget::update () 槽以刷新時鍾的顯示。
若已經擁有 QObject 子類且想要輕鬆優化,可以使用 QBasicTimer 而不是 QTimer 。采用 QBasicTimer ,必須重實現 timerEvent() 在您的 QObject 子類並在那裏處理超時。 Wiggly 範例展示如何使用 QBasicTimer .