除主線程以外的線程不允許直接調用GUI小部件對象上的方法,因爲這不會是線程安全的(因爲主GUI線程也可能隨時調用小部件上的方法,例如當窗口大小改變時重新繪製它們)。
因此,您的計算線程需要向主線程發送消息,要求它代表它們更新小部件。
通常,最簡單的方法是讓計算線程發出一個包含要顯示的數據的信號(例如作爲QString),並將該信號通過QueuedConnection連接到適當的小部件的setText()插槽(或其他適當的將更新小部件的插槽)。
另一種可能的方式是讓你的Widget線程調用QApplication :: postEvent(theTargetWidget,new MyEventType(myResultData))。在這種情況下,MyEventType將是您自己的QEvent的子類,它包含要發送到主/ GUI線程的數據。然後,您將確保(theTargetWidget)也是您的子類,您已覆蓋「bool event(QEvent *)」方法以檢查MyEventType的傳入事件,從中提取數據,並用它。每當你的計算線程調用postEvent()時,Qt會確保event()在主/ GUI線程中被儘快調用。
一旦您已經安全地設置了線程間消息傳遞(通過上述兩種方法之一),那麼使用什麼類型的QWidget來顯示結果並不重要;任何類型都可以工作。 (相反,如果你沒有安全地進行消息傳遞,Qt的任何部件都不能可靠地工作,因爲他們都不希望自己的方法直接被多線程調用)