Qt——定时器QTimer
文章目录
- Qt——定时器QTimer
- 一.定时事件timerEvent
- 二.QTimer对象
QTimer是qt中的单次和重复定时器。
其主要有两种定时方式,一种是定时事件,一种是通过信号与槽。
搬运他人博客:11111111111
一.定时事件timerEvent
在需要定时器的类中使用startTimer(x)进行定时设置和启动。
int id = startTimer(x);
其中,x是定时事件,单位是毫秒ms,startTimer会自动启动该定时器。
返回值是该定时器独一无二的id。
同时需要使用定时事件timerEvent完成具体的定时任务。
void timerEvent(QTimerEvent* ev){if(ev->timerId() == id){//判断是否是定时器id//该定时器具体的定时事件}if(ev->timerId() == id2){//判断是否是定时器id2//该定时器2具体的定时事件}...}
比如我们希望每隔1秒打印一次hello:
Widget::Widget(QWidget *parent)//构造函数: QWidget(parent), ui(new Ui::Widget){ui->setupUi(this);id1 = startTimer(1000);//id1已经设置为成员变量}void Widget::timerEvent(QTimerEvent* ev){//定时事件if(ev->timerId() == id1){qDebug() << "hello";}}
问题:似乎只能开不能控制关?
二.QTimer对象
大多数情况下我们通过使用信号与槽connect的形式完成定时任务。
首先创建一个QTimer类对象,调用start函数完成定时和启动。
之后将QTimer对象的timeout信号与自定义的任务槽函数connect即可。
同样以每隔1秒打印一次hello为例。
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){ui->setupUi(this);QTimer* t = new QTimer(this);//加入对象树t->start(1000);//以lambda表达式的形式设置槽函数connect(t, &QTimer::timeout, [=]{qDebug() << "hello";});}
值得注意的是,即便是构造函数内部的控件,如果是在lambda表达式中定义的,那么也需要使用show函数才能展示出来。尤其是使用QTimer对象时,因为经常使用lambda表达式,需要格外注意这种情况。
如果需要停止定时器,使用stop函数即可。
t->stop();