Qt 学习笔记 9.QTimer

1.QThread::msleep() 函数或 QTimer::singleShot() 函数来让程序暂停

  1. 使用 QThread::msleep() 函数

QThread::msleep() 函数可以让当前 线程 暂停一段时间。该函数接受一个整数参数(单位为毫秒),表示暂停的时间长度。

以下是使用 QThread::msleep() 函数让程序暂停 1 秒的示例代码:

#include 

// ...

// 暂停1秒
QThread::msleep(1000);
  1. 使用 QTimer::singleShot() 函数

QTimer::singleShot() 函数可以让程序在指定时间后执行一个 槽函数。大多数情况下,我们只是想等待一段时间然后执行某些代码,可以使用这个函数来实现。

以下是使用 QTimer::singleShot() 函数让程序暂停1秒的示例代码:

#include 

// ...

// 暂停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);
});

你可能感兴趣的:(qt,学习,ui)