在 Qt 应用程序中使用 sleep_for()

Using sleep_for() in Qt application

在我的应用程序中,我想用这段代码显示一些图像

myImage = scene->addPixmap(image);
myImage->setOffset(x, y);

那我想睡几秒钟:

std::this_thread::sleep_for(std::chrono::seconds(2));

然后显示另一张图片。但是这段代码首先等待 2 秒,然后同时显示两个图像。如何让程序在显示这两张图片之间等待?

使用QTimer::singleShot()并将其连接到更新图片的插槽:

class MyObject : public AQObjectInheritingClass
{
    Q_OBJECT
    ...
public Q_SLOTS:
    void changeImage()
    {
        //change image here
    }

而不是 sleep_for():

QTimer::singleShot(2000, &instanceOfMyObject, SLOT("changeImage()");

两秒后,changeImage()将被调用。

您不能在基于事件的应用程序中sleep(GUI 应用程序是基于事件的)。基于事件的应用程序有主循环,必须 运行 处理事件,并更新其状态。调用 sleep_for 会停止该主循环,因此您的应用不会处理事件,因此它不会对输入做出反应,也不会重新绘制自身。这就是为什么所有绘图如果延迟两秒然后立即刷新。

作为替代方案,您应该使用计时器,例如 QTimer

有 Qt 特定的非阻塞方式来暂停线程 QEventLoop:

QEventLoop loop;
QTimer::singleShot(1000,&loop,SLOT(quit()));
loop.exec();

在执行循环时,将处理此线程的所有其他事件。