計時器

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 .