接上文:QT从入门到实战x篇_xx_定时器实现方法1:事件timerEvent(QTimerEvent* ev),静态变量的作用域,初始化及赋值)
本篇介绍:使用QTimer类实现定时器功能,其原理是每隔一段时间就会利用timeout发送信号给槽函数执行命令,更为快捷方便,因此更为推荐。
1. 总结先给出:
(1)利用定时器类 QTimer
(2)创建定时器对象 QTimer*timer=new QTimer(this)
(3)启动定时器 timer->start(毫秒)
(4)每隔一定毫秒,发送信号 timeout进行监听
(5)停止 timer->stop
2. 这个时候我需要采用定时器第二种方法在一个label中0.5秒显示一个数字,怎么去做呢?
先加一个label控件,这回给控件加点阴影,可以有不一样的效果。
只需要在widget.cpp中调用QTimer类并进行实例化应用即可,对应增加的代码:
#include <QTimer> //定时器的类
//定时器的第二种方式
QTimer* timer=new QTimer(this); //使用this将其加在对象树上
//启动定时器 定时器每隔0.5秒就发出一个信号
timer->start(500);
//将timeout的信号与this的lambda表达式绑定,每超过0.5秒就执行一次
connect(timer,&QTimer::timeout,[=](){
static int num3=1;
//label4 每0.5秒加1
ui->label_4->setText(QString::number(num3++));
});
运行结果:
这种方法更推荐,因为实现简单,并且在需要创建多个定时器的情况下,只需要再多实例化一个对象即可。
3. 如果我想用一个按钮暂停计数呢?(应该是停止)
代码如下:
//点击一下暂停按钮,就停止计时器
connect (ui->pushButton,&QPushButton::clicked,[=]()
{
timer->stop();
});
}
运行结果如图:
4. widget.cpp中的整体代码
#include "widget.h"
#include "ui_widget.h"
#include <QTimer> //定时器的类
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//启动计时器
id1=startTimer(1000);//参数1 间隔 单位 毫秒
id2=startTimer(2000);
//定时器的第二种方式
QTimer* timer=new QTimer(this); //使用this将其加在对象树上
//启动定时器 定时器每隔0.5秒就发出一个信号
timer->start(500);
//将timeout的信号与this的lambda表达式绑定,每超过0.5秒就执行一次
connect(timer,&QTimer::timeout,[=](){
static int num3=1;
//label4 每0.5秒加1
ui->label_4->setText(QString::number(num3++));
});
//点击一下暂停按钮,就停止计时器
connect (ui->pushButton,&QPushButton::clicked,[=]()
{
timer->stop();
});
}
//timerEvent的重写,需要设置启动时机
void Widget::timerEvent(QTimerEvent* ev)
{
if(ev->timerId()==id1){
static int num=1;
ui->label_2->setText(QString::number(num++));
}
if(ev->timerId()==id2){
static int num2=1;
ui->label_3->setText(QString::number(num2++));
}
}
Widget::~Widget()
{
delete ui;
}
5. 学习视频地址:利用QTimer类实现