我可以在非GUI线程上创建小部件,然后发送到GUI吗?

问题描述 投票:2回答:1

我的MainWindow类中有一个复杂的函数,该函数定期运行查询并更改小部件的属性和数据。由于在主线程上可能要花费很长时间,因此GUI可能会冻结。

所以我在另一个线程上创建了一个GUIUpdater类来执行定期操作。我基于这里的解决方案,它显示了如何从另一个线程更新QLabel:

Qt - updating main window with second thread

但是该解决方案需要定义一个连接。对于具有多个小部件的复杂功能,很难为小部件的每个属性和数据定义连接。

有没有更简单的方法?例如:我是否可以创建全新的小部件,使其与GUIUpdater线程中的主线程上的API调用相同,并使用信号将整个小部件发送到UI,并在UI中进行替换?

multithreading qt qwidget qthread
1个回答
0
投票

我是否可以创建全新的小部件,使其与GUIUpdater线程中的主线程上的API调用相同,并使用信号将整个小部件发送到UI,并在UI中进行替换?

您不能在非GUI线程上制作窗口小部件。但是,如果您还没有,请阅读Qt's model/view separation

这意味着,可以使用界面部分链接到保存数据的单独部分,而不是使用同时管理界面和数据的“便捷”小部件。实际上,数据源可以是完全虚拟的...仅响应要求它的功能。

((您可能想看看Model/View tutorial以获得一些了解。)

因此,虽然您不能在非GUI线程上构建窗口小部件,但是可以构建类似QStandardItemModel的东西。然后,您的UI可以使用QTreeWidget,而不是使用QTreeView之类的小部件。因此,除了在线程之间传输小部件外,您还可以传输模型,然后将其连接到视图。

但是,请注意...,您必须将模型转移到GUI线程才能与小部件一起使用。数据模型和视图必须具有相同的thread affinity-前一阵子我遇到了这个问题(这是邮件列表中讨论的缓存,丢失了):

http://blog.hostilefork.com/qt-model-view-different-threads/

编写使用互斥量和信号量的数据模型,这是另一种方法。但是,通常很难正确地实现C ++中的多线程编程。因此,如果您正在做的事情确实很棘手,那么将没有任何超级easy答案。只需记住,无论您做什么,模型和视图最终都必须生活在同一线程上才能一起工作。

© www.soinside.com 2019 - 2024. All rights reserved.