我有一个QT应用程序,允许用户定义模型列表。定义的每个模型都有一个相当复杂的创建的窗口小部件类。目前,这一切都在主(GUI)线程中完成。该程序适用于正常使用,但我试图通过创建200到1000个模型来强调测试它,并且GUI的创建花了很长时间(20秒到几分钟)。
我尝试使用QtConcurrent :: run线程完成工作,但程序总是抱怨因为“必须在GUI线程中创建小部件。”
我在SO上找到了这个答案:How do I create a Window in different QT threads?。但是,除了告诉主线程创建一个新的小部件之外,这似乎在新线程中没有做太多。据我所知,这不会分配工作量。
有了这些,我有几个直接的问题:
1)是否有更好的设计(更快的性能)而不是循环遍历我的模型列表并连续创建每个小部件?
2)如果这个过程可能是多线程的,有人能指出我的方向吗?
答案 0 :(得分:2)
实际上没有办法将widget内容放到其他线程中。 OpenGL呈现或小部件的一些数据处理,以便在准备就绪时显示,这样的东西可以轻松使用其他线程,但不能使用实际的小部件。
更好的设计是在需要时创建小部件。或者只是拥有一个小部件并更新它显示的数据(除非不同项目的小部件实际上不同)。
如果您在滚动时担心性能,那么一个解决方案是仅在当前的一个窗口可见一段最短时间后切换窗口小部件(例如,如果用户继续滚动,则为500毫秒,或者在上次滚动事件后200毫秒,某些逻辑请注意,这不是对用户选择作出反应的延迟,这是在选择和可见小部件更改后的延迟,因此如果用户只是更改为下一个项目,则会立即更新GUI。但是在滚动时,窗口小部件不会针对短暂选择的每个项目进行更新,并且事情不会变慢。使用QTimer
或两个来更新小部件时发送信号。