在Qt解决方法中在非GUI线程中添加小部件?

时间:2013-02-11 05:48:09

标签: multithreading qt

我一直在 Qt 中开展一个项目。 有一个父类,当我的程序在启动时运行时会添加所有GUI内容。 但是在获取用户输入之后,我在各种其他类中执行一些数学运算来检查不正确的用户输入(每个类用于特定类型的错误)。这些类的对象已被移动到我创建的其他线程( obj - > movetothread thread ))。因此,我可以通过多线程同时检查所有错误。问题是,每当有不正确的用户输入时,我想抛出一个 MessageBox ,其中包含有关该相应错误的信息。由于错误检查是在非GUI线程上完成的,因此它正在崩溃我的程序。因此,我唯一的选择是保留包含该错误的QString的引用&当我最后从所有错误检查中返回时,我在 GUI线程中一个接一个地抛出Messageboxe。这个过程非常麻烦,我想知道是否有任何解决方法可以解决这个问题?

PS:简而言之,如何在多线程应用程序中的非GUI线程中添加GUI内容?

2 个答案:

答案 0 :(得分:4)

您不必从非GUI线程操纵GUI。一个好的方法是在需要操作GUI并等待用户的答案时(例如在QSemaphore或您喜欢的任何地方)从工作线程发出信号。使用Qt :: QueuedConnection将该信号连接到生活在GUI线程中的QObject中实现的插槽。这将运行GUI线程中的插槽。

无论如何,你可以在这个主题上找到你需要的东西。刚开始搜索。

答案 1 :(得分:0)

正确的方法是发出信号并在GUI线程中捕获它,如上所述,但你也可以通过使用QMetaObject :: invokeMethod()

来实现