QTimer类为我们提供了一个即可重复触发又可单次触发的定时器。它是一个高层次的应用程序接口。要使用它,只需创建一个QTimer类对象,将它的timeout()信号连接到适当的函数上,然后调用其start()函数开启定时器即可,此后,QTimer对象就会周期性的发出timeout()信号。
例如,一个1s执行一次的定时器,可以如下设置:
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);
这样,update()就会每隔1秒被调用一次。
当然,我们也可以让一个QTimer对象在启动后只触发一次,只需调用该类的setSingleShot(true)即可。其实,更简单的做法是使用该类的静态方法QTimer::singleShot(),以某个时间间隔来启动一个单次触发的定时器。例如:
QTimer::singleShot(2000, this, SLOT(updateCaption()));
上面这句代码执行结束,2s后会调用一次updateCaption(),并且只调用一次。
要注意的是在多线程程序中,我们可以在任何开启了事件循环的线程中启动定时器。而要在一个非GUI线程中开启事件循环,则需要调用QThread::exec()。而Qt会使用定时器的线程依附性来决定由哪个线程发出timeout()信号。鉴于此,必须在定时器对象所在的线程中开启和结束定时器,不能跨线程操作。
比较特殊的一点是,在构建QTimer 对象时,可以传入0作为时间间隔。这样的定时器会在窗口系统的事件队列中的事件都被处理完之后触发。这可以用来在GUI程序中处理一些后台任务,比如垃圾收集。
下面我们使用QTimer类,来周期性的改变窗口的背景图片。
新建一个GUI工程Timer,完成后,在