【Qt】qt延时

Qt 延时(等待)代码大全

Qt 里延时分两种常用场景:

  1. 非阻塞延时(界面不卡死,推荐)
  2. 阻塞延时(界面会卡住,仅简单场景用)

1. 非阻塞延时(推荐,界面不卡死)

方法1:QTimer 单次延时(最标准、最安全)

cpp 复制代码
#include <QTimer>

// 延时 1000 毫秒(1秒)后执行一段代码
QTimer::singleShot(1000, this, [=]() {
    // 延时结束后要执行的代码写在这里
    qDebug() << "延时1秒后执行";
});

✅ 优点:完全不卡界面 、线程安全、官方推荐

✅ 适用:按钮点击后延时、UI 动画、异步操作


方法2:封装成非阻塞延时函数(可以直接等待)

cpp 复制代码
#include <QEventLoop>
#include <QTimer>

void sleepMs(int msec)
{
    QEventLoop loop;
    QTimer::singleShot(msec, &loop, &QEventLoop::quit);
    loop.exec();
}

// 使用:
sleepMs(1000); // 延时1秒,不卡死界面

✅ 优点:像 sleep() 一样用,但不卡界面

⚠️ 缺点:多次调用会出问题,只能偶尔用一次,不能连续 / 多次调用

cpp 复制代码
//下面的代码会出错
sleepMs(1000);
sleepMs(1000);
sleepMs(1000);

2. 阻塞延时(界面会卡住,慎用)

方法1:Qt 内置延时函数

cpp 复制代码
// 需要头文件 #include <QThread>
QThread::msleep(1000);   // 毫秒
QThread::sleep(1);       // 秒
QThread::usleep(1000);   // 微秒

⚠️ 缺点:界面会卡死不动,只适合后台线程使用。


3. 循环+刷新界面(伪非阻塞)

cpp 复制代码
void delayMs(int msec)
{
    QTime dieTime = QTime::currentTime().addMSecs(msec);
    while (QTime::currentTime() < dieTime)
        QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}

// 使用
delayMs(1000);

⚠️ 不推荐,容易出问题,仅老项目兼容用。


总结(直接选这个)

  • 90% 场景用:
    QTimer::singleShot(毫秒, this, [](){ 代码 });
  • 想直接写等待语句用:
    封装 sleepMs(int msec) 非阻塞函数
  • 绝对不要在主线程用:
    QThread::msleep()(会卡界面)
相关推荐
眠りたいです18 分钟前
现代C++:C++17中的新库特性
开发语言·c++·c++20·c++17
devnullcoffee21 分钟前
亚马逊 Buy Box 数据采集完全指南(2026):Python 实战 + Pangolinfo API
开发语言·python·亚马逊数据采集·亚马逊数据 api·pangolinfo api·亚马逊 buy box 数据·亚马逊数据采集软件
sleven fung23 分钟前
Whisper库
开发语言·人工智能·python·算法·ai·whisper
天若有情67342 分钟前
【C++趣味实战】仿写Burp代理逻辑!自定义可控迭代器:拦截Intercept/放行Forward/重放Repeater全实现
java·开发语言·c++
l1t43 分钟前
DeepSeek总结的使用实体-组件-系统和基于存在性处理进行Python编程37-38
开发语言·python
迷藏49443 分钟前
Python+DuckDB:轻量级BI流水线实战
java·开发语言·python·原型模式
咋吃都不胖lyh1 小时前
短期记忆和长期记忆都存 MySQL
android·java·开发语言
rime_neko1 小时前
js学习笔记
开发语言·前端·javascript
caimouse1 小时前
ReactOS 硬件资源仲裁器 (Arbiter) 完整实现计划
开发语言
新手村领路人2 小时前
在macos python中安装dlib
开发语言·python·macos