• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
sn-genuine
博客园    首页    新随笔    联系   管理    订阅  订阅

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、面试重点背诵

  1. QTimer依赖Qt事件循环,没有事件循环环境定时器不生效。
  2. start(msec)启动循环定时器,不断发出timeout();stop()停止。
  3. QTimer::singleShot()静态函数:只执行一次,不需要创建定时器对象。
  4. 精度:PreciseTimer毫秒高精度;默认CoarseTimer存在少量误差。
  5. 给QTimer设置parent,不用手动delete,由父对象统一回收内存。
  6. isActive()判断定时器是否正在运行。

易错:QTimer不要在子线程直接实例化使用;子线程使用定时器需要开启子线程事件循环。

5、时间格式化说明

QTime tm = QTime::currentTime();
tm.toString("hh:mm:ss.zzz");
  • hh:小时
  • mm:分钟
  • ss:秒
  • zzz:毫秒
posted on 2026-08-30 21:08  SobNov  阅读(6)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3