1、基础版实现
(1)头文件类中定义Timer *mTime;
指针变量或直接定义QTimer
定时器变量,如下:
QTimer mTime;
(2)绑定信号槽
connect(&mTime,&QTimer::timeout,this,&Mainwindow::slotTime);
//或
connect(&mTime,SIGNAL(timeout()),this,SLOT(slotTime()));
这里依据官方说法,好像建议使用上着方法。
(3)启动 / 停止 定时器
mTime.start(m_nSpeed);
mTime.stop();
2、便捷版实现(基于Lambda函数)
Lambda函数介绍: https://blog.csdn.net/weixin_42887343/article/details/122099296
这种实现和1种无差别,只是信号槽绑定有所不同,实现如下:
QTimer *mTime = new QTime();
connect(mTime,&QTimer::timeout,this,[=]()
{
//update(); //定时处理内容
});
mTime.start(m_nSpeed);
使用Lambda函数方式,这种方法最大好处就是省去了声明槽函数。
3、一次性版实现
从名字来看就是只处理一次,实现如下:
QTimer::singleShot(1000,this,[=]{
//update(); //定时处理内容
});
这种方法比较特殊,特定情况下非常适用。
举个例子: 为了防止按钮不小心重复点击或双击,在按钮的点击槽中添加如下代码可完美实现该需求。
void MainWindow::on_pushButton_2_clicked()
{
ui->pushButton_2->setEnabled(0); //失能按钮,此时不可点
QTimer::singleShot(500,this,[=]{
ui->pushButton_2->setEnabled(1); //500ms后使能按钮,此时可点
});
//按钮点击处理函数
}
4、重写定时器事件版实现(QObject内部定时器)
(1)重写timerEvent
函数(timerEvent
为QObject
类的虚函数),在类的头文件中定义如下:
void timerEvent(QTimerEvent *event); //定时器事件
int m_timerId; //定义一个定时器ID
(2)启动定时器并返回定时器ID,一般在初始化函数(或构造函数)中实现,如下:
m_timerId = startTimer(1000); //参数为定时时间
killTimer(m_timerId); //在需要时关闭定时器
(3)处理定时器事件
void RadarWidgit::timerEvent(QTimerEvent *event)
{
if(m_timerId == event->timerId()) //判断定时器ID
{
//处理m_timerId定时器事件
}
// else if(m_timerId == event->timerId())
// {
//处理定时器2的事件
// }
}
这种方法最大的好处就是,在需要许多个定时器的时候,可以减少系统资源,不过我们一般很少用这种方法,所以也比较少见。
使用该方法创建多个定时器的实现:
QList<int> timerIdList; //定时器ID链表
for(int i = 0;i < 100;i ++) //创建100个定时器
timerIdList.append(startTimer(1000));
void RadarWidgit::timerEvent(QTimerEvent *event)
{
if(timerIdList.at(0) == event->timerId()) //判断定时器ID
{
//处理定时器1的事件
}
else if(timerIdList.at(1) == event->timerId())
{
//处理定时器2的事件
}
...
}