2010-08-16 57 views
3

我有一個應用程序,使用20個不同的類。程序執行在mainwindow中開始。我開始一個進度對話框。我會利用不同的課程來達到不同的目的。在執行到特定類的每個函數調用並執行所需並返回到mainwindow類之後,我將更新進度對話框。現在,問題是當執行遠離主窗口類時進度對話框凍結。取消按鈕無法訪問,因此,執行不能在需要的時間停止。QT進度對話框取消按鈕不突出

mainclass :: mainclass() {

ProgressDialog-> EXEC();

x->add(); 

updateProgressDialog(); 

y->do(); 

updateProgressDialog(); 

zz->bring(); 

updateProgressDialog(); 

}

//的x,y,z是三個不同的類。

這就是執行過程。只要我在主類中輸入函數,我就會啓動進度對話框。並從不同類別調用函數。這些功能需要相當長的時間。我已經調用了一個線程來執行執行部分,但我無法取消進度對話框。我希望在proggress對話框上按下取消按鈕時停止程序執行。

請讓我知道如何擺脫這個問題。希望我在這裏清楚。

+0

你提到你調用一個線程來完成執行一部分。這是否意味着X->添加(),Y> do()和zz-bring()交給一個線程並立即返回? – 2010-08-16 21:39:02

回答

1

不知道你的線程正在執行什麼樣的計算,很難找出問題的原因。也許這可以幫助:執行長操作(按:維托爾德Wysota)從Keeping the GUI Responsive

摘錄
在長時間的計算(不考慮信號和槽任何使用的)所有事件處理被停止。因此,不刷新GUI,不處理用戶輸入,網絡活動停止,定時器不觸發 - 應用程序看起來像被凍結,事實上,它與時間密集型任務無關的部分是凍結。

0

你正在調用的函數沒有處理Qt事件循環。您正在使用模態進度條,因爲您正在調用exec()。這意味着Qt只有在您更新對話框時才能獲得控制權。

我知道解決此問題的唯一方法是將對話框編碼爲無模式,但您還必須爲事件循環提供處理機會。

這在Qt的文檔相當數量的詳細解釋:QProgressDialog