在Qt中,对象属于创建它的线程。 我们需要从后台线程访问在主线程中创建的控件。 但是,只要我们引用该对象,应用程序就会进入挂起状态。 请让我知道如何访问和修改未创建控件的不同线程中的控件。
提前致谢。
答案 0 :(得分:3)
嗯,我不能同意。 Qt清楚地表示你不能从其他线程访问gui而不是main。有两种方法可以实现您的需求。
updateProgressBar(int)
,线程信号updateProgressBar(int)
。您可以像这样进行连接connect(workerThread, SIGNAL(updateProgressBar(int)), mainWindow, SLOT(updateProgressBar(int)), Qt::QueuedConnection)
您也可以将工作线程信号直接连接到要更新的小部件>= QEvent::User
和<= QEvent::MaxUser
),在主窗口中重新实现customEvent并正确处理这些事件。通过QCoreApplication::postEvent(mainWindow, yourCustomEvent)
答案 1 :(得分:1)
您可以从后台线程发出信号,以便在主线程的插槽中执行。如果我没记错的话,如果在连接调用中指定Qt :: AutoConnection,则会自动完成。
答案 2 :(得分:1)
对于由不同线程拥有的对象,您将无法从一个线程访问许多特定于Qt的代码部分。最简单的方法是使用信号和插槽,如OregonGhost所示。如果这还不够,您应该查看事件代码。您可以向对象A发送一个事件,该对象包含指向对象B的指针(应该接收响应),然后在对象A的customEvent()
函数中,为响应创建一个事件并将其发布到对象B. cusotmEvent()
函数始终在拥有给定对象的线程中运行,因此您可以安全地在此时与Qt提供的代码进行交互。将事件发布到另一个对象也特别列为线程安全的,无论接收对象的拥有线程如何。
答案 3 :(得分:0)
尝试将类指针传递给构造函数。