天天看点

Qt中定时器的所有使用方式

在Qt中使用定时器一般有三种方式:

参考博客:

​​Qt | 定时器的使用 - 知乎​​

​​QT定时器事件startTimer_谢永奇1的博客-_starttimer​​

​​Qt之定时器_付康为的博客-qt 定时器​​ 

一、直接使用QObject类提供的定时器。

​QObject​

​​是所有​

​Qt​

​对象的​​基类​​,它提供了一个基本的定时器。

1.在需要开启定时器的地方直接调用startTimer();

该函数的声明为:int startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer);

该函数开启一个定时器,返回值是定时器的编号。

参数一为时间间隔,单位毫秒;

参数二为定时器的精确度:

Qt::PreciseTimer(精确的定时器,尽量保持毫秒精度,试图保持精确度在1毫秒);

Qt::CoarseTimer(粗略的定时器,尽量保持精度在所需的时间间隔5%范围内);

Qt::VeryCoarseTimer(很粗略的定时器,只保留完整的第二精度,大约为500毫秒);

2.重载void QObject::timerEvent ( QTimerEvent * event );

当定时器溢出时,会自动响应timerEvent()函数。

在timerEvent()函数中,通过event->timerId()来确定是哪个定时器触发的;

3.在需要关闭定时器的地方调用killTimer();

该函数的声明为: void killTimer(int Id);

该函数关闭一个定时器,参数为定时器的编号。

示例如下:

#include <QTimer>

int timerid1;
int timerid2;

timerid1 = startTimer(1000);
timerid2 = startTimer(3000);

void MainWindow::timerEvent(QTimerEvent *e)
{
  if(e->timerId()==timerid1)
  {
    qDebug("timer1");
  }
  else if(e->timerId()==timerid2)
  {
    qDebug("timer2");
  }
  
  killTimer(timer1);
}      

二、使用QTimer类。

1.用new的方式创建一个QTimer对象。

QTimer *timer = new QTimer(this);

2.将定时器的溢出信号连接到自定义的槽函数。

connect(timer, &QTimer::timeout, this, &Myself::update);

3.启动定时器。

timer->start(1000);

函数原型为:void start(int msec);参数为定时器时间间隔,单位毫秒。

也可以调用timer->setInterval(1000);设置定时器时间间隔,然后调用timer->start();开启定时器。

4.停止定时器。

timer->stop();

示例代码如下:

// 产生一个定时器
QTimer *timer = new QTimer(this); 

//连接这个定时器的信号和槽,利用定时器的timeout(),从而触发clear()槽函数
connect(timer, &QTimer::timeout, this, &MainWindow::fun)); 

//开始定时器,并设定定时周期,每隔5秒就会重启定时器,会重复触发定时,除非你利用stop()将定时器关掉
timer->start(5000); 

// 仅仅启动定时器一次
timer->setSingleShot(true);      

三、仅调用一次溢出的定时器。

//这个是静态函数,不用创建对象直接用

QTimer::singleShot(1000, this, SLOT(OnSendBreath()));

函数原型有两个:

1.static void singleShot(int msec, const QObject *receiver, const char *member);

参数一为时间间隔,单位毫秒;参数二为接收溢出信号的对象;参数三为溢出信号的槽函数;

2.static void singleShot(int msec, Qt::TimerType timerType, const QObject *receiver, const char *member);

参数一为时间间隔,单位毫秒;参数二为定时器的精确度(同上文);参数三为接收溢出信号的对象;参数四为溢出信号的槽函数。

QTimer::singleShot (100, this, SLOT (onTimeout()));      

附录:

继续阅读