QObject , the base class of all Qt objects, provides the basic timer support in Qt. With QObject::startTimer (), you start a timer with an interval in milliseconds as argument. The function returns a unique integer timer ID. The timer will now fire at regular intervals until you explicitly call QObject::killTimer () with the timer ID.
For this mechanism to work, the application must run in an event loop. You start an event loop with QApplication::exec (). When a timer fires, the application sends a QTimerEvent , and the flow of control leaves the event loop until the timer event is processed. This implies that a timer cannot fire while your application is busy doing something else. In other words: the accuracy of timers depends on the granularity of your application.
In multithreaded applications, you can use the timer mechanism in any thread that has an event loop. To start an event loop from a non-GUI thread, use QThread::exec (). Qt uses the object's 线程倾向性 to determine which thread will deliver the QTimerEvent . Because of this, you must start and stop all timers in the object's thread; it is not possible to start timers for objects in another thread.
The upper limit for the interval value is determined by the number of milliseconds that can be specified in a signed integer (in practice, this is a period of just over 24 days). The accuracy depends on the underlying operating system. Windows 2000 has 15 millisecond accuracy; other systems that we have tested can handle 1 millisecond intervals.
The main API for the timer functionality is QTimer . That class provides regular timers that emit a signal when the timer fires, and inherits QObject so that it fits well into the ownership structure of most Qt programs. The normal way of using it is like this:
object is made into a child of
object so that, when
object is deleted, the timer is deleted too. Next, its
signal is connected to the slot that will do the work, it is started with a value of 1000 milliseconds, indicating that it will time out every second.
QTimer also provides a static function for single-shot timers. For example:
QTimer::singleShot(200, this, &Foo::updateCaption);
200 milliseconds (0.2 seconds) after this line of code is executed, the
slot will be called.
In multithreaded applications, you can use QTimer in any thread that has an event loop. To start an event loop from a non-GUI thread, use QThread::exec ()。Qt 使用计时器的 线程倾向性 去确定哪个线程将发射 timeout() 信号。因此，必须在其线程中启动 停止计时器；从另一线程启动计时器是不可能的。
If you already have a QObject subclass and want an easy optimization, you can use QBasicTimer 而不是 QTimer 。采用 QBasicTimer , you must reimplement timerEvent() 在您的 QObject subclass and handle the timeout there. The Wiggly example shows how to use QBasicTimer .