【问题标题】:QT Creating many complex widgetsQT 创建许多复杂的小部件
【发布时间】:2013-12-21 11:39:25
【问题描述】:

我有一个允许用户定义模型列表的 QT 应用程序。定义的每个模型都创建了一个相当复杂的小部件类。目前,这一切都在主(GUI)线程中完成。该程序可以正常使用,但我试图通过创建 200 到 1000 个模型来对其进行压力测试,并且创建 GUI 需要很长时间(20 秒到几分钟)。

我尝试了几次尝试使用 QtConcurrent::run 将工作线程化,但程序总是抱怨,因为“必须在 GUI 线程中创建小部件。”

我在 SO:How do I create a Window in different QT threads? 上找到了这个答案。但这在新线程中似乎并没有做太多,除了告诉主线程创建一个新的小部件。据我所知,这不会分配工作量。

说了这么多,我有几个直接的问题:

1) 有没有比遍历我的模型列表并连续创建每个小部件更好的设计(更快的性能)?

2)如果这个过程可能是多线程的,有人可以指出一个简单示例的方向吗?

【问题讨论】:

  • 更好的设计是在需要时创建小部件...您实际上有多少小部件一次可见?你的意思是什么型号? QAbstractItemModel 的子类还是什么?
  • 感谢您的意见!一次只能看到一个小部件。有一个树形视图可用于选择您希望在给定时间显示的小部件。仅在需要时显示它们可能会起作用,但是如果有人要一次滚动浏览所有模型,我会担心动态加载它们。

标签: c++ multithreading qt


【解决方案1】:

确实没有办法将小部件的内容放到其他线程中。 OpenGL 渲染或小部件的一些数据处理以在准备好时显示,这样的东西可以很容易地使用其他线程,但不是实际的小部件。

更好的设计是在需要时创建小部件。或者只拥有一个小部件并更新它显示的数据(除非不同项目的小部件实际上不同)。

如果您担心滚动时的性能,那么一种解决方案是仅在当前小部件可见一段时间后才切换小部件(例如,如果用户继续滚动,则为 500 毫秒,或者在最后一次滚动事件后 200 毫秒,一些逻辑像那样)请注意,这不是对用户选择做出反应的延迟,这是延迟选择和可见小部件更改后,因此如果用户只是更改到下一个项目,则 GUI 会立即更新。但是在滚动时,小部件不会为每个短暂选择的项目更新,并且事情不会减慢。当小部件应该更新时,使用QTimer 或两个发送信号。

【讨论】:

  • 感谢您的设计理念。我会试一试的。
  • 通过仅根据需要初始化小部件的显示部分,我能够启动 1000 多个模型,而对启动时间的影响很小。我还没有实现滚动逻辑,但这看起来很有希望。再次感谢您。
猜你喜欢
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
相关资源
最近更新 更多