2010-11-09 59 views
1

我正在使用第三方庫,我想在回調到UI(用qt編寫)時發生一些事件。我使用UI的函數指針註冊回調函數,但是當我得到回調函數時,出現以下錯誤 「QObject :: startTimer:QTimer只能用於以QThread開頭的線程」和 「QPixmap:它不是可以安全地在GUI線程之外使用pixmaps「 和分段錯誤。從非UI類到Qt UI的回調函數

我搜查,發現我不能直接調用UI功能,因爲它被稱爲在不同的線程

我想知道我怎麼可以註冊回調函數來更新UI。

回答

0

嗯,這聽起來像你需要兩樣東西:

  1. 設置了信號和槽的回調非GUI的QObject類。
  2. 確保從主程序GUI線程調用/創建此類和/或其函數,可能作爲程序運行時存在的(指針)數據成員。

我認爲這將解決互操作問題。

+0

該類不一定在同一個線程中。這是信號/插槽的功能。 – ypnos 2010-11-09 09:40:44

+0

我已經創建了一個新的類和一個靜態函數,並將其指針傳遞給回調函數,但它仍然給出相同的錯誤。我只是調用回調函數和打印一些跟蹤,而不是現在甚至不更新ui。 – prasad 2010-11-09 11:15:38

+0

@ypnos:我認爲是這樣,但顯然OP需要它在同一個線程中...你的解決方案似乎更好,但:) – rubenvb 2010-11-09 17:13:54

1

解決辦法有三個:

  • 使用的QThread實例你的工作線程。
  • 使用QImage而不是QPixmap。 QPixmaps存儲在圖形子系統中,因此由主(GUI)線程控制。 QImages生活在記憶中,可以由任何線程保存。
  • 使用信號/插槽概念。從主線程以外的其他線程發出信號是合法的。

僅當您還希望在工作線程內部接收到信號時,來自用戶輸入的反饋(例如「取消」按鈕),您的工作線程中也需要一個QT事件循環。如果您的QTimer要在工作線程w/o事件循環中觸發一個插槽,則無法工作。

閱讀http://doc.trolltech.com/4.5/threads.html