2010-09-28 22 views
1

在C#中,你可以做更新GUI時,你需要更新從另一個線程在GUI下面:的Qt4 - 從不同的線程


control.Invoke(delegate() 
{ 

    // Do whatever you want in the gui thread here 

}); 

是否有類似的Qt4和簡單的東西? (PyQt4專門)
我寧可不進入信號,插槽,並使用本機線程,而不是QThreads,如果可能的話。

從非qt(native)線程更新Qt4 gui的最簡單方法是什麼?

回答

0

信號可以跨線程 - 這是它們的主要點。

通常在Qt中,gui線程是唯一允許更新gui的線程,正常最簡單的解決方案是讓gui運行一個計時器並重繪本身讀取工作線程中函數或變量的任何進度。

0

最簡單的方法是使用信號和槽,作爲qt documentation狀態

儘管QObject的是折返,在GUI 類,特別是QWidget的及其所有子類 ,是不可重入。他們 只能從主線程使用。 如前所述, QCoreApplication :: exec()也必須是從該線程調用的 。

信號可以通過使用可以從一個線程發送到另一個線程的隊列立即遞送或延遲(通過隊列)。

要不帶信號,你必須實現自己的線程來進行線程通信,可能是另一個隊列。

3

我不確定這是否比信號和插槽更容易,但在某些情況下我喜歡使用自定義事件。

在某些QObject子類如MyObject中,您可以覆蓋customEvent()以根據您的某個自定義事件執行某些活動。

您可以使用QCoreApplication::postEvent()從任何線程發佈自定義事件到MyObject。這將要求調用者瞭解一點Qt。爲了解決這個問題,我喜歡在MyOjbect上編寫一個方法,它封裝了創建自定義事件並將其發佈到自身。

該發佈是異步的,並且customEvent()中的執行運行在gui線程中。

如果您需要傳遞數據,子類QEvent與setter和getters。

這是一個非常簡短的概述,但文檔應該有所幫助。如果你有問題,我可以發佈一些代碼。