Qt定时器QTimer使用教程与代码演示
Qt定时器QTimer使用教程与代码演示
Qt提供了定时器类QTimer, 在使用时需要包含头文件
#include <QTimer>
QTimer类方法介绍:
- void start(int msec); 开启定时器,定时间隔的msec毫秒
- void stop(); 结束定时
QTimer信号:
- void timeout(QPrivateSignal); 在链接定时器时,需要绑定该信号
QTimer的基本使用
下面介绍如何使用Qt定时器实现一个秒表。
新建一个Qt MainWindow项目,界面如下:
时间的显示用的LCD控件 QLCDNumber
运行效果
MainWindow 头文件代码:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTimer>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_btnStart_clicked();void on_btnStop_clicked();void on_btnContinue_clicked();void on_timer();private:Ui::MainWindow *ui;QTimer *m_pTimer;int m_counts = 0; //时间计数
};
#endif // MAINWINDOW_H
在头文件定义了定时器对象指针m_pTimer,毫秒计数m_counts
MainWindow cpp代码
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//LCD控件,需要先设置显示的数字个数,再显示数字,不然显示不全ui->lcdNumber->setDigitCount(9);ui->lcdNumber->display("00:00:000");//new QTimer, 设置定时器类型m_pTimer = new QTimer(this);m_pTimer->setTimerType(Qt::PreciseTimer);//链接定时器信号timeout,当调用start时,触发槽函数on_timerconnect(m_pTimer, &QTimer::timeout, this, &MainWindow::on_timer);
}MainWindow::~MainWindow()
{delete ui;
}//开始计时
void MainWindow::on_btnStart_clicked()
{m_pTimer->start(1); //开启定时器,频率为1msm_counts = 0;
}//暂停计时
void MainWindow::on_btnStop_clicked()
{m_pTimer->stop();
}//继续计时
void MainWindow::on_btnContinue_clicked()
{m_pTimer->start(1);
}void MainWindow::on_timer()
{m_counts++;char buf[64];if(m_counts < 1000) //1秒以内{sprintf(buf, "00:00:%03d", m_counts);}else if(m_counts > 1000 && m_counts < 60 * 1000) //一分钟以内{int seconds = m_counts / 1000;int ms = m_counts - seconds * 1000;sprintf(buf, "00:%02d:%03d", seconds, ms);}else{int mins = m_counts / (60 * 1000);int seconds = (m_counts - mins * 60 * 1000) / 1000;int ms = m_counts - mins * 60 * 1000 - seconds * 1000;sprintf(buf, "%02d:%02d:%03d", mins, seconds, ms);}ui->lcdNumber->display(buf);
}
需要注意的是,QTimer可以设置类型,也就是调用setTimerType进行设置,QTimer声明的定时器类型如下:
enum TimerType {PreciseTimer,CoarseTimer,VeryCoarseTimer};
这三种什么意思呢,Qt助手的解释如下:
- Qt::PreciseTimer 精确的计时器试图保持毫秒的精确度
- Qt::CoarseTimer 粗计时器试图将精度保持在所需间隔的5%以内
- Qt::VeryCoarseTimer 非常粗糙的计时器只能保持完全的秒精度
在new QTimer时,可以根据需求设置定时器精度。
在UNIX(包括Linux, macOS和iOS)上,Qt将保持毫秒精度的Qt::PreciseTimer。对于Qt::CoarseTimer,间隔将被调整至5%,以使计时器与其他预期在或大约在同一时间触发的计时器对齐。目标是让大多数计时器在同一时间唤醒,从而减少CPU唤醒和功耗。
在Windows上,Qt将使用Windows的多媒体定时器工具(如果可用)用于Qt::PreciseTimer和普通的Windows定时器用于Qt::CoarseTimer和Qt::VeryCoarseTimer。
在所有平台上,Qt::VeryCoarseTimer的间隔被舍入到最近的满秒(例如,23500ms的间隔将被舍入到24000ms, 20300ms将被舍入到20000ms)。
QTimer::singleShot使用说明
QTimer除了周期性的执行某种操作,还可以单次执行,QTimer的静态函数singleShot就是为了实现这种单次操作功能,singleShot在一个给定时间间隔 msec(毫秒) 之后调用一个槽,例如下面的代码:
void MainWindow::on_pushButton_clicked()
{QTimer::singleShot(3000,this,[=]{//想要执行的代码qDebug() << "hello world" ;});
}
在3000ms后,将打印hello world, 上面是用的lambdab函数,也可以用类成员函数来写,代码如下:
头文件,在头文件定义成员函数do_single,给QTimer::singleShot做槽函数
class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();//定义成员函数,给QTimer::singleShot做槽函数void do_single();private slots:void on_pushButton_clicked();private:Ui::MainWindow *ui;
};
cpp文件
void MainWindow::on_pushButton_clicked()
{
// QTimer::singleShot(3000,this,[=]{
// //想要执行的代码
// qDebug() << "hello world" ;
// });QTimer::singleShot(3000, this, &MainWindow::do_single);
}void MainWindow::do_single()
{qDebug() << "hello world" ;
}
注意singleShot它只会触发一次,发出一次信号,然后来执行槽函数。