Qt 延时(等待)代码大全
Qt 里延时分两种常用场景:
- 非阻塞延时(界面不卡死,推荐)
- 阻塞延时(界面会卡住,仅简单场景用)
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()(会卡界面)