由于创建小部件需要花费大量时间,因此我尝试在不同的线程中创建小部件并将它们添加到主布局中,但这会失败。创建窗口小部件然后按顺序添加它们时,程序正常工作。我收到的通知:“QObject :: setParent:无法设置父级,新父级位于不同的线程中” 有办法吗?
答案 0 :(得分:0)
不,没有办法。
包括QWidget
在内的Qt GUI类只能在主线程中使用。
引用Qt documentation:
虽然QObject是可重入的,但是GUI类,尤其是QWidget和 它的所有子类都不是可重入的。它们只能用于 主线程。如前所述,QCoreApplication :: exec()也必须如此 从该线程调用。
当您构建Q_ASSERT_X
时,QWidget
会在Qt代码中执行此操作:
Q_ASSERT_X(q->thread() == qApp->thread(), "QWidget",
"Widgets must be created in the GUI thread.");
因此,即使您找到一些可以使它工作的工作,您也无法保证您的代码能够以可重现的方式工作,并且任何Qt更新都不会破坏您的代码。
关于您的具体问题,创建小部件不应该非常耗时。我可以想出为什么耗费时间的两个原因: