1.QThread::msleep() 函数或 QTimer::singleShot() 函数来让程序暂停
- 使用
QThread::msleep()
函数
QThread::msleep()
函数可以让当前 线程 暂停一段时间。该函数接受一个整数参数(单位为毫秒),表示暂停的时间长度。
以下是使用
QThread::msleep()
函数让程序暂停
1
秒的示例代码:
#include <QThread>
// ...
// 暂停1秒
QThread::msleep(1000);
- 使用
QTimer::singleShot()
函数
QTimer::singleShot()
函数可以让程序在指定时间后执行一个 槽函数。大多数情况下,我们只是想等待一段时间然后执行某些代码,可以使用这个函数来实现。
以下是使用
QTimer::singleShot()
函数让程序暂停1秒的示例代码:
#include <QTimer>
// ...
// 暂停1秒
QTimer::singleShot(1000, this, []{
// 执行需要暂停的代码
});
在上述代码示例中,我们使用
QTimer::singleShot()
函数让程序在
1
秒后执行一个
Lambda
表达式,其中包含需要暂停的代码。需要注意的是,如果需要在非
UI
线程中使用
QTimer::singleShot()
函数,还需要使用
QEventLoop
让非
UI
线程可以处理
QTimer
事件。
1.1QTimer::singleShot() 函数
QTimer::singleShot()
函数可以用来在指定的时间后执行一个特定的槽函数。该函数是
QTimer
的静态函数,不需要创建
QTimer
对象,通常用于实现延迟执行一些代码的需求。
QTimer::singleShot()
函数的声明如下:
void QTimer::singleShot(int msec, const QObject *receiver, const char *member);
该函数接受三个参数:
msec
:指定的延迟时间,单位为毫秒。
receiver
:接收到定时器信号后的对象。
member
:接收到定时器信号后要执行的槽函数。可以是普通的槽函数或
Lambda
表达式。
QTimer::singleShot()
函数会在经过毫秒数为
msec
的时间后,将一个定时器事件放入事件队列中,然后马上返回。当指定的延迟时间到达时,事件循环将处理该定时器事件,调用接收到定时器信号的对象的指定槽函数。被调用的槽函数可以是
QObject
的任何已声明槽函数或
Lambda
表达式。
以下是一个使用
QTimer::singleShot()
函数延迟执行代码的示例,该示例演示了当按钮被点击时延迟执行一个槽函数的功能:
void MainWindow::on_pushButton_clicked()
{
QTimer::singleShot(1000, this, [](){
// 延迟1秒执行的槽函数
qDebug() << "延迟1秒后执行";
});
}
在该示例中,我们使用
QTimer::singleShot()
函数将一个定时器事件放入队列中,告知程序在
1000
毫秒后执行指定的槽函数。槽函数的执行内容为打印一条调试信息。可以看到,当按钮被点击时,程序并没有马上执行该槽函数,而是在经过
1
秒后才执行。这就实现了延迟执行某些代码的功能。
需要注意的是,
QTimer::singleShot()
函数只会执行 一次,如果需要重复执行某个操作,需要使用
QTimer
类提供的其他函数。
2.报错分析
报错代码
QTimer::singleShot(5000, this, []{// 暂停 5 秒
// 执行需要暂停的代码
qDebug() << “指令尾出错”;
WrongData2Text(rawData);// 错误指令写到 text 中
});
错误内容:
‘this’ cannot be implicitly captured in this context.
错误原因
Lambda
表达式在捕获
this
指针时未显式地给定符号
[ ]
内的捕获模式。
在
Lambda
表达式中使用
this
指针时,需要注意它所在的上下文。如果
Lambda
表达式在类中定义,而且捕获了
this
指针,那么
this
将指向该类的实例。在此情况下,为确保
this
能被正确捕获,我们必须显式地给定
Lambda
表达式的捕获列表。
以下是使用显式捕获列表来修复错误的示例:
QTimer::singleShot(5000, this, [this]() { // 正确的写法,显式地捕获了 this 指针
qDebug() << "指令尾出错";
WrongData2Text(rawData);
});
版权归原作者 zll_@ 所有, 如有侵权,请联系我们删除。