在我的應用程序要使用此代碼在Qt應用程序使用sleep_for()
myImage = scene->addPixmap(image);
myImage->setOffset(x, y);
然後我想幾秒鐘睡眠顯示一些圖像:
std::this_thread::sleep_for(std::chrono::seconds(2));
,然後顯示另一個圖像。但是這個代碼首先等待2秒鐘,然後一次顯示兩個圖像。如何讓程序在顯示這兩個圖像之間等待?
在我的應用程序要使用此代碼在Qt應用程序使用sleep_for()
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();
當正在執行循環,所有其他處理該線程的事件。
不要在基於事件循環的應用程序中使用睡眠方法。請改用計時器。 – MrEricSir
親愛的先生。 @skypjack我寫了'如何讓程序在顯示這兩個圖像之間等待?'不僅僅是如何讓程序等待;-) @MrEricSir感謝您的回覆,您能告訴我什麼是計時器嗎? –