2012-09-13 83 views
20

這似乎應該是自動的,但顯然不是。我有以下代碼:「完成」在進入一個單獨的功能之前強制Qt GUI更新

ui.my_label->setText("Test 1..."); 
    ui.my_label->adjustSize(); 

    processThatTakesAbout30SecondsToFinish(files[0].toStdString()); 

    ui.my_label->setText("Finished."); 
    ui.my_label->adjustSize(); 

正在發生的事情是,我從來沒有看到作爲"Test1...",的GUI似乎掛起,直到下面的函數完成,我eventaully僅見。

如何在進入該功能之前確保GUI正在更新?
謝謝。

+2

你有沒有試過類似'repaint()'或'update()'? – Derek

回答

24

你可以在輸入你的代碼之前處理事件隊列,如果你;

#include <QApplication> 

並且,當你想刷新你的GUI時,調用;

qApp->processEvents(); 

注意,這可能是一個好主意,讓你的長時間運行的進程調用,現在再發揮作用,讓你的GUI感覺更敏感。

+2

這肯定會起作用,儘管我通常會嘗試建議不要調用'processEvents',因爲如果代碼不可重入,它可能會導致很多意想不到的問題。 – Chris

14

如果你不在乎你的GUI在這段時間內有反應,那麼打電話給my_label->repaint()就可以了。除非你屈服於事件循環,否則Qt不能爲你自動執行任何操作。

爲了獲得最大的響應速度,您可以考慮在單獨的線程中運行進程,並在處理完成時使用信號/槽連接(默認爲線程安全)向主GUI線程發送信號。

3

我只是想補充一點,對我來說,它採取了我在這裏看到的兩個答案的組合。所以對我來說有效的是:

ui.my_label->setText("Test 1..."); 
ui.my_label->adjustSize(); 

//! Both of these lines needed 
ui.my_label->repaint(); 
qApp->processEvents(); 

processThatTakesAbout30SecondsToFinish(files[0].toStdString()); 

ui.my_label->setText("Finished."); 
ui.my_label->adjustSize(); 

希望這可以幫助別人。

+0

'self.progress.setVisible(False)''self.repaint()'適用於我的情況 – Winand

+0

呵呵,對我也一樣。我需要他們兩個人的工作。你會認爲'processEvents'會自動重繪所有東西。 –

相關問題