如果我们在某个类中要用到定时器的功能,可以选择两种方式:
1.如果此类继承于QObject,可以直接调用以下函数:
int QObject::startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer)
此函数开启一个定时器,但只返回该定时器的编号,我们无法获取定时器对象(即使创建了定时器对象也不应该是QTimer类型的,因为,这是在QObject类中的成员函数,不应该出现子类QTimer的身影),所以也无法使用信号与槽机制,只能通过重载定时器事件处理函数:
[virtual protected] void QObject::timerEvent(QTimerEvent *event)
在timerEvent()函数中可以通过定时器Id来区分多个定时器,并分别处理;
关闭定时器可以在类中调用以下函数:
void QObject::killTimer(int id)
这里要注意
定时器不能被其它线程start,哪个线程创建的就必须使用哪个线程start否则会提示
QObject::startTimer: Timers cannot be started from another thread
如果不是在主线程中使用必须 exec() 使子线程可以正常接收信号
void CMyThread::run()
{
qDebug() << "start timer";
CTimer* pTimer = new CTimer;
pTimer->StartTimer(100, [](){
qDebug() << "123";
});
this->exec();
}
关闭定时器,必须要在相同的线程里关闭,也就是说你在什么线程启动,就要在什么线程关闭
或者用主线程关闭
扫描二维码关注公众号,回复:
8814716 查看本文章
2.可以在类中添加一个QTimer类型的成员,这样我们就可以通过信号与槽机制类实现相应的功能,举例如下:
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);