天天看點

Qt彈出的對話框界面無法重新整理(設定的樣式不生效)

問題背景:

項目開發時需要實作:當服務啟動時,彈出一個對話框用于提示目前服務在啟動,當服務啟動成功後對話框自動關閉。

問題現象:

對話框可以正常彈出,但彈出非模式對話框(即使用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網上看到的,沒測試過。

繼續閱讀