除主线程以外的线程不允许直接调用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的任何部件都不能可靠地工作,因为他们都不希望自己的方法直接被多线程调用)