【发布时间】:2017-11-22 07:36:50
【问题描述】:
由于创建小部件需要很多时间,我尝试在不同的线程中创建小部件并将它们添加到主布局中,但失败了。创建小部件然后按顺序添加它们时,程序可以正常工作。我收到的通知:“QObject::setParent:无法设置父级,新父级在不同的线程中” 有办法吗?
【问题讨论】:
标签: c++ multithreading qt qwidget
由于创建小部件需要很多时间,我尝试在不同的线程中创建小部件并将它们添加到主布局中,但失败了。创建小部件然后按顺序添加它们时,程序可以正常工作。我收到的通知:“QObject::setParent:无法设置父级,新父级在不同的线程中” 有办法吗?
【问题讨论】:
标签: c++ multithreading qt qwidget
不,没有办法。
Qt GUI 类包括QWidget 只能在主线程中使用。
引用Qt documentation:
虽然 QObject 是可重入的,但 GUI 类,尤其是 QWidget 和 它的所有子类都是不可重入的。它们只能从 主线程。如前所述,QCoreApplication::exec() 也必须是 从那个线程调用。
当您构造 QWidget 时,这在 Qt 代码中由 Q_ASSERT_X 强制执行:
Q_ASSERT_X(q->thread() == qApp->thread(), "QWidget",
"Widgets must be created in the GUI thread.");
因此,即使您能找到一些变通方法使其工作,您也无法保证您的代码将以可重现的方式工作,并且任何 Qt 更新都不会破坏您的代码。
关于您的具体问题,创建小部件不应费时。我可以想到两个耗时的原因:
【讨论】: