Qt 关于定时器实用的总结

在实际编程中常常会使用到定时器,现在就将定时器的用法作个总结。

第一种方案:startTimer + QTimerEvent

对于一个QObject的子类,只需要使用
int QObject::startTimer(int interval) 函数来开启一个定时器。当定时器溢出时可以在timerEvent() 函数中进行相关操作。

例如:

// 开启一个1秒定时器,返回其ID 代表该定时器
id1 = startTimer(1000);    //1000毫秒为一秒
id2 = startTimer(2000);
id3 = startTimer(3000);
//溢出处理函数
void Widget::timerEvent(QTimerEvent *event)
{
    // 判断是哪个定时器,在调试窗口输出相应的语句。
    if(event->timerId() == id1){
        qDebug() << "timer1";
    }
    else if(event->timerId() == id2){
        qDebug() << "timer2";
    }
    else{
        qDebug() << "timer3";
    }
}

第二种方案:QTimer类+信号和槽

使用QTimer类来构造一个定时器,然后信号和槽关联溢出事件。

例如:
在构造函数中添加:

    // 创建一个新的定时器
    QTimer *timer = new QTimer(this);
    // 关联定时器的溢出信号到我们的槽函数上
    connect(timer,SIGNAL(timeout()),this,SLOT(timerUpdate()));
    // 设置溢出时间为1秒,并启动定时器
    timer->start(1000);

槽函数里实现相关操作:


// 定时器溢出处理
void Widget::timerUpdate()
{
    // 实现相关操作
    //.....

}

定时器与线程

编写QT程序时,时常会需要使用定时器QTimer来执行一些定时任务,但当定时任务执行的时间过长,则会影响整个界面的响应,因此会想到使用另一个工作线程来执行定时器,一般情况下可以选择从QThread派生一个线程类。

例如:
在窗口类头文件加入:

QThread* pWThread;
QTimer* pWTimer ;

1、构造定时器线程:

 /* ---------------构造一个定时器线程------------------------------*/
      pWThread= new QThread(this);
      pWTimer = new QTimer();
      pWTimer->start(200);
      pWTimer->moveToThread(pWThread);

      connect(pWTimer,SIGNAL(timeout()),this,SLOT(on_TimeoutSlot()),Qt::QueuedConnection);
      connect(pWThread, SIGNAL(finished()), pWThread, SLOT(deleteLater()));
       connect(this, SIGNAL(stop()), pWTimer, SLOT(stop()));

      pWThread->start();

2、

void Test::on_TimeoutSlot()
{
  // 实现相关操作
    //.....

}

3、析构函数加入:

emit stop();  
pWThread->quit();  
pWThread->wait();
delete pWTimer ;  
delete pWThread;  
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐