我正在使用Qt Creator开发Qt 5.5。 我有一个名为settingsWindow的大类,顾名思义,它会处理各种设置。这些设置然后用于启动一些QDialogs,这些QDialogs在qGraphicsView内的场景上显示非常复杂的动画,通过QCoreApplication :: processEvents()不断更新,而后者依次保持GUI响应。动画通过QDialog的start()方法启动。 我想同时运行这些QDialog,例如通过按钮启动,在同一时刻启动所有这些QDialog。我尝试使用一个包装器,即一个继承自QObject的简单类,每次都将它分配给一个不同的线程,但是如果我开始一个QDialog一切顺利,当我开始第二个时,第一个"块" (动画停止,只有在第二个Qdialog中动画才可见)。 我唯一的解决方案是为它们中的每一个启动一个单独的QProcess(这样我确定它们分别运行并且在不同的线程上),但我需要重写逻辑(每个QDialog的单独程序)。
任何更简单的解决方案?提前谢谢。
答案 0 :(得分:1)
不能在一个过程中完成。触及QWidget
的任何内容都只能在主线程中运行。您的代码恰好运行是巧合,您依赖于未定义的行为,Qt从未打算以这种方式使用。没有对此进行测试,依此类推:您自己也是如此,您必须深入研究Qt代码以找出允许更改的内容。
如果您正在制作过于复杂且无法在GUI线程中呈现的动画,并且您坚持使用旧版小部件,那么您必须使用QPainter
将其呈现为{{ 1}},通过QImage
进行异步工作。然后异步工作人员将图像发送到对话框,然后后者将它们显示到屏幕上。
有关两个相关示例的链接,请参阅this answer。
否则,请使用QML。对于大多数事情,从CPU的角度来看,QML动画几乎都是无操作的。 GPU完成所有渲染,并且表现令人钦佩。
多处理方法当然也是可行的。随意启动相同的可执行文件,其参数指定用于进程间通信的管道的随机名称,以及修改行为(第1对第2对话框等)。有关如何轻松启动的信息,请参阅this answer。
答案 1 :(得分:0)
没有张贴任何代码很难帮助。
您可以尝试为每个对话框创建一个线程,然后将一个对话框移动到每个线程(使用QObject::moveToThread
)。
每个线程都必须给其他线程一些时间执行指令(调用QThread::yieldCurrentThread
或QThread::sleep
)。否则,如果一个线程在一个巨大的循环中做某事,它将永远不会让其他人有机会做某事。