【发布时间】:2012-07-19 08:52:08
【问题描述】:
在 Qt 中,对象属于创建它的线程。 我们需要从后台线程访问在主线程中创建的控件。 但是,一旦我们引用该对象,应用程序就会进入挂起状态。 请让我知道如何访问和修改尚未创建控件的不同线程中的控件。
提前致谢。
【问题讨论】:
标签: qt4
在 Qt 中,对象属于创建它的线程。 我们需要从后台线程访问在主线程中创建的控件。 但是,一旦我们引用该对象,应用程序就会进入挂起状态。 请让我知道如何访问和修改尚未创建控件的不同线程中的控件。
提前致谢。
【问题讨论】:
标签: qt4
我不能同意。 Qt 明确表示您不能从除主线程之外的其他线程访问 gui。有两种方法可以满足您的需求。
updateProgressBar(int),线程信号updateProgressBar(int)。你可以像这样connect(workerThread, SIGNAL(updateProgressBar(int)), mainWindow, SLOT(updateProgressBar(int)), Qt::QueuedConnection) 建立连接你也可以将你的工作线程信号直接连接到你想要更新的小部件>= QEvent::User 和<= QEvent::MaxUser),在主窗口中重新实现customEvent 并正确处理这些事件。通过QCoreApplication::postEvent(mainWindow, yourCustomEvent) 将事件传递到您的主窗口(然后您需要指向您的主窗口对象)
【讨论】:
您可以从后台线程触发信号,在主线程的插槽中执行。如果我没记错的话,如果你在 connect 调用中指定 Qt::AutoConnection,这会自动完成。
【讨论】:
您将无法从一个线程访问许多 Qt 特定的代码部分以获取另一个线程拥有的对象。解决这个问题的最简单方法是使用信号和插槽,正如OregonGhost 所建议的那样。如果这还不够,您应该查看事件代码。您可以向对象 A 发送一个事件,其中包含指向对象 B 的指针(应该接收响应),然后在对象 A 的 customEvent() 函数中,为响应创建一个事件并将其发布到对象 B。@ 987654323@ 函数始终在拥有给定对象的线程中运行,因此您可以安全地与 Qt 提供的代码进行尽可能多的交互。将事件发布到另一个对象也被明确列为线程安全的,无论接收对象的拥有线程如何。
【讨论】:
尝试将类指针传递给构造函数。
【讨论】: