0


Qt 学习笔记 9.QTimer

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

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

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

以下是使用

QThread::msleep()

函数让程序暂停

1

秒的示例代码:

#include <QThread>

// ...

// 暂停1秒
QThread::msleep(1000);
  1. 使用 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);
});
标签: qt 学习 ui

本文转载自: https://blog.csdn.net/qq_45662289/article/details/129789045
版权归原作者 zll_@ 所有, 如有侵权,请联系我们删除。

“Qt 学习笔记 9.QTimer”的评论:

还没有评论