gpt4 book ai didi

c++ - 如何在不同线程中同时运行多个 QDialogs?

转载 作者:行者123 更新时间:2023-11-30 05:36:24 25 4
gpt4 key购买 nike

我正在使用 Qt Creator 开发 Qt 5.5。我有一个名为 settingsWindow 的大类,顾名思义,它负责各种设置。这些设置然后用于启动一些 QDialogs,这些 QDialogs 在 qGraphicsView 内的场景上显示非常复杂的动画,通过 QCoreApplication::processEvents() 不断更新,这反过来又保持 GUI 响应。动画是通过 QDialog 的 start() 方法启动的。我想同时运行这些 QDialogs,例如通过按钮启动同时启动所有这些 QDialogs。我尝试使用包装器,即从 QObject 继承的简单类,每次都将其分配给不同的线程,但如果我启动 QDialog 一切正常,当我启动第二个时,第一个“ block ”(动画停止,仅在第二个 Qdialog 中动画可见)。我唯一的解决方案是为它们中的每一个启动一个单独的 QProcess(通过这种方式我确定它们单独运行并且在不同的线程上),但我需要重写逻辑(每个 QDialog 的单独程序)。

有更简单的解决方案吗?提前谢谢你。

最佳答案

它不能在单个进程中完成。任何接触 QWidget 的东西都只能在主线程中运行。您的代码恰好运行完全是巧合,您依赖于未定义的行为,而 Qt 从来没有打算以这种方式使用。没有对此进行测试,等等:您只能靠自己,并且必须深入研究 Qt 代码以找出要更改的内容以允许其中任何一项。

如果您正在做的动画太复杂而无法在 GUI 线程中呈现,并且您坚持使用旧版小部件,则必须使用 QPainter 将它们呈现到 QImage,作为通过QtConcurrent::run 的异步工作。然后,异步工作人员将向对话框发送图像信号,然后对话框将它们以 blit 方式显示到屏幕上。

参见 this answer两个相关示例的链接。

否则,使用QML。对于大多数事情,从 CPU 的角度来看,QML 动画几乎是空操作。 GPU 负责所有渲染工作,并且表现出色。

多处理方法当然也是可行的。随意启动相同的可执行文件,参数指定用于进程间通信的管道的随机名称,并修改行为(第一个与第二个对话框等)。参见 this answer了解如何轻松启动自己。

关于c++ - 如何在不同线程中同时运行多个 QDialogs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33574196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com