2016-05-03 74 views
0

在我的應用程序要使用此代碼在Qt應用程序使用sleep_for()

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

然後我想幾秒鐘睡眠顯示一些圖像:

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

,然後顯示另一個圖像。但是這個代碼首先等待2秒鐘,然後一次顯示兩個圖像。如何讓程序在顯示這兩個圖像之間等待?

+0

不要在基於事件循環的應用程序中使用睡眠方法。請改用計時器。 – MrEricSir

+0

親愛的先生。 @skypjack我寫了'如何讓程序在顯示這兩個圖像之間等待?'不僅僅是如何讓程序等待;-) @MrEricSir感謝您的回覆,您能告訴我什麼是計時器嗎? –

回答

3

使用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()將被調用。

3

基於事件的應用程序中不能sleep(GUI應用程序是基於事件的)。基於事件的應用程序具有主循環,必須運行該循環才能處理事件並更新其狀態。調用sleep_for會停止該主循環,因此您的應用程序不會處理事件,因此它不會對輸入做出反應,也不會重新繪製自身。這就是爲什麼所有繪圖如果推遲兩秒鐘然後立即刷新。

作爲替代,你應該使用計時器,如QTimer

0

有Qt的特異性無阻塞的方式暫停線程與QEventLoop

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

當正在執行循環,所有其他處理該線程的事件。