QTimer 定时器
QTimer 定时器笔记
1、QTimer 简介
在Qt窗口程序中,经常需要周期性执行任务、动画效果,可以使用QTimer定时器类。
- 创建
QTimer对象,调用start()开启定时器 - 定时时间到,周期性发出
timeout()信号 - Qt定时器依赖事件循环,不能在子线程直接使用(没有事件循环)
2、常用API
2.1 构造函数
QTimer::QTimer(QObject *parent = nullptr);
如果指定parent父对象,堆上的QTimer对象会自动析构,不用手动
delete。
2.2 设置时间间隔
// 设置定时器间隔,单位:毫秒
void setInterval(int msec);
// 获取定时器间隔,返回毫秒
int interval() const;
2.3 启动 / 停止定时器
// 启动定时器,需要提前 setInterval
[slot] void QTimer::start();
// 重载:启动并直接设置超时毫秒数
[slot] void QTimer::start(int msec);
// 停止定时器
[slot] void QTimer::stop();
2.4 定时器精度设置
// 设置定时器精度
void setTimerType(Qt::TimerType atype);
Qt::TimerType timerType() const;
精度枚举:
| 枚举 | 说明 |
|---|---|
Qt::PreciseTimer |
精确,毫秒级 |
Qt::CoarseTimer |
默认,误差约5% |
Qt::VeryCoarseTimer |
粗糙,精度约1秒 |
2.5 单次触发判断
// 判断是否只触发一次
bool isSingleShot() const;
// true:只触发一次;false:重复触发(默认false)
void setSingleShot(bool singleShot);
2.6 判断定时器运行状态
// 定时器正在运行返回true,停止返回false
bool isActive() const;
2.7 信号
[signal] void QTimer::timeout();
定时器超时,发射该信号,业务逻辑绑定这个信号。
2.8 静态函数 singleShot(只执行一次)
// msec毫秒之后执行一次槽函数,不会循环
[static] void QTimer::singleShot(int msec, const QObject *receiver, PointerToMemberFunction method);
3、完整示例代码
UI界面:
loopBtn:开启/关闭循环定时器按钮curTime:QLabel,显示循环定时器的当前时间onceBtn:触发单次定时器按钮onceTime:QLabel,显示单次定时器时间
#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include <QTimer>
#include <QTime>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 创建定时器对象,指定父对象,自动内存回收
QTimer* timer = new QTimer(this);
// 设置定时器精度
timer->setTimerType(Qt::PreciseTimer);
// 循环定时器:按钮控制开启/停止
connect(ui->loopBtn,&QPushButton::clicked,this,[=](){
if(timer->isActive()){
timer->stop(); // 关闭定时器
ui->loopBtn->setText("开始");
} else {
ui->loopBtn->setText("关闭");
timer->start(1000); // 启动定时器,1000ms = 1秒
}
});
// timeout信号,定时触发,刷新当前时间
connect(timer,&QTimer::timeout,this,[=](){
QTime tm = QTime::currentTime();
QString tmstr = tm.toString("hh:mm:ss.zzz");
ui->curTime->setText(tmstr);
});
// 单次定时器 singleShot,2秒之后执行一次,不会循环
connect(ui->onceBtn,&QPushButton::clicked,this,[=](){
QTimer::singleShot(2000,this,[=](){
QTime tm = QTime::currentTime();
QString tmstr = tm.toString("hh:mm:ss.zzz");
ui->onceTime->setText(tmstr);
});
});
}
MainWindow::~MainWindow()
{
delete ui;
}
4、面试重点背诵
QTimer依赖Qt事件循环,没有事件循环环境定时器不生效。start(msec)启动循环定时器,不断发出timeout();stop()停止。QTimer::singleShot()静态函数:只执行一次,不需要创建定时器对象。- 精度:
PreciseTimer毫秒高精度;默认CoarseTimer存在少量误差。 - 给
QTimer设置parent,不用手动delete,由父对象统一回收内存。 isActive()判断定时器是否正在运行。
易错:
QTimer不要在子线程直接实例化使用;子线程使用定时器需要开启子线程事件循环。
5、时间格式化说明
QTime tm = QTime::currentTime();
tm.toString("hh:mm:ss.zzz");
hh:小时mm:分钟ss:秒zzz:毫秒
浙公网安备 33010602011771号