使用带有 mutythread 的 QGridLayout::addWidget

Posted

技术标签:

【中文标题】使用带有 mutythread 的 QGridLayout::addWidget【英文标题】:use QGridLayout::addWidget with mutythread 【发布时间】:2017-11-22 07:36:50 【问题描述】:

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

【问题讨论】:

【参考方案1】:

不,没有办法。

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

关于您的具体问题,创建小部件不应费时。我可以想到两个耗时的原因:

当您创建小部件时,它们正在执行大量计算。然后你应该把计算,而且只有计算,放在另一个线程中。 您正在一次创建大量小部件。您可以使用事件循环延迟创建。基本上,您创建一些小部件,然后发布一个事件或设置一个计时器,以创建更多小部件等,直到您满足一些停止条件。

【讨论】:

我的问题是计算。我是这样修的,但它看起来一点也不好看。我仍然想保持一致,在包含的数据中计算。感谢您的帮助。

以上是关于使用带有 mutythread 的 QGridLayout::addWidget的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 uuencode 的“sendmail”发送邮件,并带有主题

HBase - 使用带有值列表的一列与使用带有列列表的一列族的优缺点是啥?

使用带有 ajax Rest 调用的 Spring CSRF 和带有 Thymeleaf 的 HTML 页面

如何使用带有或不带有 Appium 的 Robot Framework 集成 WinAppDriver?

如何在带有 React 的 Typescript/JSX 中使用带有箭头函数的泛型?

优化数据库有啥更好的方法:使用带有不同过滤器的一堆存储过程,还是使用带有 if 条件的单个存储过程?