使用带有mutythread的QGridLayout :: addWidget

时间:2017-11-22 07:36:51

标签: c++ multithreading qt qwidget

由于创建小部件需要花费大量时间,因此我尝试在不同的线程中创建小部件并将它们添加到主布局中,但这会失败。创建窗口小部件然后按顺序添加它们时,程序正常工作。我收到的通知:“QObject :: setParent:无法设置父级,新父级位于不同的线程中” 有办法吗?

1 个答案:

答案 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更新都不会破坏您的代码。

关于您的具体问题,创建小部件不应该非常耗时。我可以想出为什么耗费时间的两个原因:

  • 您的小部件在创建它们时会进行大量计算。然后你应该把计算,只计算,放在另一个线程中。
  • 您一次创建了许多小部件。你可以使用事件循环来减少创建。基本上,你创建一些小部件然后发布一个事件或设置一个定时器,它将创建更多的小部件,等等,直到你遇到一些停止条件。