Qt4 - 从不同的线程更新gui

时间:2010-09-28 22:51:15

标签: qt4 pyqt

在C#中,只要需要从另一个线程更新gui,就可以执行以下操作:


control.Invoke(delegate()
{

   // Do whatever you want in the gui thread here

});

Qt4有类似和简单的东西吗? (具体是PyQt4)
我宁愿不进入信号,插槽,并尽可能使用本机线程而不是QThreads。

从非qt(本机)线程更新Qt4 gui的最简单方法是什么?

3 个答案:

答案 0 :(得分:3)

我不确定这是否比信号和插槽更容易,但在某些情况下我喜欢使用自定义事件。

在某些QObject子类中,例如MyObject,您可以覆盖customEvent()以根据您的某个自定义事件执行某些活动。

您可以使用MyObject从任意线程向QCoreApplication::postEvent()发布自定义事件。这将要求调用者知道一点Qt。为了解决这个问题,我想在MyOjbect上编写一个方法来封装创建自定义事件并将其发布给自己。

发布是异步的,customEvent()中的执行在gui线程中运行。

如果您需要传入数据,请使用setter和getter继承QEvent

这是一个非常简短的概述,但文档应该有所帮助。如果您遇到问题,我可以发布一些代码。

答案 1 :(得分:0)

信号可以跨越线程 - 这就是它们的主要观点。

一般来说,在Qt中,gui线程是唯一一个允许更新gui的线程,正常最简单的解决方案是让gui运行一个定时器并重新绘制自己从工作线程中的函数或变量读取任何进度。

答案 2 :(得分:0)

最简单的方法是使用信号和插槽,作为qt documentation状态

  

虽然QObject是可重入的,但是GUI   类,尤其是QWidget及其所有   子类,不可重入。他们   只能在主线程中使用。   如前所述,   QCoreApplication :: exec()也必须是   从该线程调用。

可以使用可以从一个线程向另一个线程发送信号的队列立即传递信号或延迟传递(通过队列)。

要没有信号,你必须实现自己的线程来进行线程通信,可能是另一个队列。