Qt定时器问题

如果我们在某个类中要用到定时器的功能,可以选择两种方式:

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();
}

关闭定时器,必须要在相同的线程里关闭,也就是说你在什么线程启动,就要在什么线程关闭

或者用主线程关闭

2.可以在类中添加一个QTimer类型的成员,这样我们就可以通过信号与槽机制类实现相应的功能,举例如下:

      QTimer *timer = new QTimer(this);
      connect(timer, SIGNAL(timeout()), this, SLOT(update()));
      timer->start(1000);
发布了45 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ly1390811049/article/details/102912755