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

时间:2009-11-20 10:45:03

标签: qt4

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

提前致谢。

4 个答案:

答案 0 :(得分:3)

嗯,我不能同意。 Qt清楚地表示你不能从其他线程访问gui而不是main。有两种方法可以实现您的需求。

  1. 在线程和主窗口之间进行Qt :: QueuedConnection,即主窗口插槽updateProgressBar(int),线程信号updateProgressBar(int)。您可以像这样进行连接connect(workerThread, SIGNAL(updateProgressBar(int)), mainWindow, SLOT(updateProgressBar(int)), Qt::QueuedConnection)您也可以将工作线程信号直接连接到要更新的小部件
  2. 定义您自己的自定义事件(您的自定义事件类型值必须为>= QEvent::User<= QEvent::MaxUser),在主窗口中重新实现customEvent并正确处理这些事件。通过QCoreApplication::postEvent(mainWindow, yourCustomEvent)
  3. 将事件传递到主窗口(然后需要指向主窗口对象的指针)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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