Qt4 从不同线程访问Qt小部件

Qt4 从不同线程访问Qt小部件,qt4,Qt4,在Qt中,对象属于创建它的线程。 我们需要从后台线程访问在主线程中创建的控件。 然而,只要我们引用对象,应用程序就会进入挂起状态。 请让我知道如何访问和修改未创建控件的不同线程中的控件 提前感谢。尝试将类指针传递给构造函数。您可以从后台线程触发信号,以便在主线程的插槽中执行。如果我没记错的话,如果在连接调用中指定Qt::AutoConnection,这将自动完成。对于另一个线程所拥有的对象,从一个线程访问许多特定于Qt的代码部分时会遇到问题。解决这个问题的最简单方法是使用信号和插槽,正如所建议的

在Qt中,对象属于创建它的线程。 我们需要从后台线程访问在主线程中创建的控件。 然而,只要我们引用对象,应用程序就会进入挂起状态。 请让我知道如何访问和修改未创建控件的不同线程中的控件


提前感谢。

尝试将类指针传递给构造函数。

您可以从后台线程触发信号,以便在主线程的插槽中执行。如果我没记错的话,如果在连接调用中指定Qt::AutoConnection,这将自动完成。

对于另一个线程所拥有的对象,从一个线程访问许多特定于Qt的代码部分时会遇到问题。解决这个问题的最简单方法是使用信号和插槽,正如所建议的那样。如果这还不够,您应该查看事件代码。您可以向对象A发送一个事件,该事件包含一个指向对象B(应该接收响应)的指针,然后在对象A的
customEvent()
函数中,为响应创建一个事件并将其发送到对象B。
cusotmEvent()
函数始终在拥有给定对象的线程中运行,因此,您可以安全地与Qt提供的代码进行交互。将事件发布到另一个对象也被明确列为线程安全,无论接收对象的线程是谁。

我不同意。Qt清楚地表明,除了主线程之外,您不能从其他线程访问gui。有两种方法可以实现你所需要的

  • 在线程和主窗口之间建立Qt::QueuedConnection,即主窗口插槽
    updateProgressBar(int)
    ,线程信号
    updateProgressBar(int)
    。您可以这样连接
    connect(workerThread,SIGNAL(updateProgressBar(int)),mainWindow,SLOT(updateProgressBar(int)),Qt::QueuedConnection)
    您还可以将工作线程信号直接连接到要更新的小部件
  • 定义自己的自定义事件(自定义事件类型值必须是
    =QEvent::User