問題背景:
項目開發時需要實作:當服務啟動時,彈出一個對話框用于提示目前服務在啟動,當服務啟動成功後對話框自動關閉。
問題現象:
對話框可以正常彈出,但彈出非模式對話框(即使用show函數)時,對話框的樣式不生效,打開的是一個黑色對話框。使用模式對話框(即使用exec函數)時,可以正常顯示樣式。但這裡需要使用非阻塞的對話框,對話框打開後程式需要繼續運作,模式對話框不滿足要求。
問題原因:
查了一些資料,發現由于我的服務啟動有依賴關系,代碼裡在最後一個服務啟動前主進場休眠了5秒鐘,這就導緻休眠時程式沒有再處理事件響應,UI無法重新整理。是以樣式也沒有顯示出來。
解決方案:
解決思路就是在休眠的時候,繼續處理程式的事件響應。主要兩種方式:
1、使用QElapsedTimer延時5秒,延時過程中繼續處理事件
#include <QElapsedTimer>
#include <QCoreApplication>
QElapsedTimer t;
t.start();
while(t.elapsed()<5000)
{
QCoreApplication::processEvents();
}
2、 建立子事件循環,在子事件循環中,父事件循環仍然是可以執行的
QEventLoop loop;//定義一個新的事件循環
QTimer::singleShot(5000, &loop, SLOT(quit())); //建立單次定時器
loop.exec(); //事件循環開始執行,程式會卡在這裡,直到定時時間到,本循環被退出
我使用的方式2,親測有效。方法1網上看到的,沒測試過。