在 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();
在执行循环时,将处理此线程的所有其他事件。
在我的应用程序中,我想用这段代码显示一些图像
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();
在执行循环时,将处理此线程的所有其他事件。