2016-02-29 49 views
1

我有一個關於Qt及其信號/插槽機制的問題。
我已經創建了一個自定義小部件,並且我創建了一個自定義SIGNAL(ShowMessage)。該信號連接到SLOT,它在我的主窗口的狀態欄中顯示消息(以及指定的超時)。強制Qt自定義信號立即被處理?

現在,我在我的課上有一個操作需要很長時間來執行,並且它阻止了用戶界面。我希望emit我的信號在開始操作之前,當它結束時,emit它再次更新狀態欄;是這樣的:

emit ShowMessage(message, timeout); 
// Do the long operation 
emit ShowMessage(newMessage, timeout); 

但我的問題是,它似乎是Qt的等待,直到整個操作完成,並只更新與newMessage狀態欄。
有沒有辦法以某種方式「強制」我的信號立即處理,因爲如果我想訴諸線程,那麼我的生活會變得更加複雜!

+0

這個長期操作是什麼?爲什麼很難將其移至新線程? – thuga

+0

你使用Qt :: DirectConnection連接嗎? - 這應確保您的信號已經立即處理完畢。如果不是,那麼你應該使用調試器來查看發生了什麼。我假設這一切都發生在同一個GUI線程? –

+0

對不起,但我不明白'Qt :: DirectionConnection'的含義。我是Qt的新手,我將它用作OpenGL圖形的容器。 – Farzad

回答

2

有沒有辦法以某種方式 「逼」 我的信號立即處理

,有。 :-)。 顯示第一條信息後,請致電QCoreApplication::processEvents()。這迫使所有未決事件在呼叫點處理。例如,

emit ShowMessage(message, timeout); 
QCoreApplication::processEvents(); 
// Do the long operation 
emit ShowMessage(newMessage, timeout); 
+0

非常感謝您的回答:) 它修復了最初的問題,但它在我的應用程序中創建了另一個問題。我不知道你對OpenGL有多熟悉,但我在我的應用程序中調用了本地API OpengGL方法,現在當調用'glDrawElements'時我收到「訪問衝突錯誤」。你知道這裏發生了什麼嗎? 我不知道添加此方法和我的OpenGL調用之間的連接是什麼 – Farzad

+0

@Farzad您正在同步編碼。不要,你的問題會消失。從事件循環中調用的所有東西(所有連接到Qt信號的插槽)都需要快速完成。你的信號*被立即處理,但是因爲你阻塞了事件循環,所以小部件從來沒有機會重新繪製自己。您不能阻止事件循環。如果您需要在GUI線程中進行長時間處理,則需要對其進行小塊處理,作爲對零時長定時器過期的反應。不要遞歸到'processEvents'中,它可以重新輸入你的代碼,我認爲這是不好的建議。 –

+0

@KubaOber你能詳細談談你提到的計時器嗎?我是Qt新手,我將它用作調用OpenGL函數的容器。我的「長期」操作實際上是從文件加載(和緩衝)模型,所以我不知道你的意思是使用計時器 – Farzad