如何在处理时更改 GUI

Posted

技术标签:

【中文标题】如何在处理时更改 GUI【英文标题】:how to change GUI while processing 【发布时间】:2011-08-07 14:59:28 【问题描述】:

我是 Qt 编程新手,但我有 C++ 基础。

我想在处理过程中更新我的 GUI,例如:

while (....)


        do some calculation...

        if (condition fulfill)

            change the color of label.

但是,我意识到我未能获得我想要的结果(在处理时更新 GUI)。 GUI 只会在 while 循环之后更新。 为什么会这样?有人可以帮忙吗?

另外,我希望“减慢”颜色变化,因为处理速度太快,我看不到动画。有什么想法吗?

非常感谢!

说明: 实际上我希望更新 GUI 同时我正在处理...意思是,如果我有 100 次迭代,每次迭代后我希望更新 GUI 立即.

【问题讨论】:

你可能会发现我编写的一个库 Thinker-Qt,看起来很有趣(虽然它确实处于 alpha 状态):hostilefork.com/thinker-qt 【参考方案1】:

使用 QTimer。这将允许您控制动画的速度并保持您的 UI 响应。

【讨论】:

QTimer 可以在每次迭代后更新 GUI 吗?我没有这样做,因为 GUI 只会在整个迭代后更新...... 定时器非常常用来定期更新 gui 慢是什么意思?我不相信你了解计时器。 Ops 抱歉,我的意思是我仍然需要进行多线程处理,因为虽然我使用 QTimer 立即更新 GUI(我设置了 0 毫秒),但 GUI 只会在整个迭代完成后重绘。 . 是的,非常感谢您的评论。其实是我的错。如果我使用 QTimer,我找到了 GUI 没有更新的原因。在很短的时间内发送了太多信号来更新 GUI(因为几百次迭代可以在几百毫秒内完成)。这就是为什么 GUI 没有相应更新并挂起的原因。 QTimer 实际上工作得很好。非常感谢..【参考方案2】:

您必须将您的处理代码放到另一个线程并更新 gui,因为像这个 GUI 将等待您的进程结束并在其结束后刷新

在此处阅读更多信息:http://www.qtcentre.org/threads/41545-How-to-refresh-GUI-while-heavy-processing-is-ongoinghttp://www.qtcentre.org/threads/32416-Update-GUI-from-another-threadForcing the Qt GUI to update

【讨论】:

意思是,我应该这样做?? while(...) 做一些计算... 如果(条件满足)创建一个新线程来更新 GUI 实际上,计时器是一种更简单的方法。不需要线程。 如果你打算使用线程,你不应该,你只需要一个线程,而不是每个循环一个。 我的处理速度太快,导致我的 GUI 没有响应(因为在很短的时间内发送了太多信号来更新 GUI)。我需要“休眠”处理线程以保持我的 GUI 更新......【参考方案3】:

您不一定需要线程。 调用 QApplication::processEvents() 将处理未决事件,包括您在处理过程中可能导致的任何重绘。

【讨论】:

你仍然需要让 gui 线程休眠,这永远不会好 假设您想在另一个线程中进行处理,这并不总是需要。原来的帖子听起来他不是多线程的。 不,我假设所有处理都在主 gui 线程中。当前代码需要休眠以减慢转换速度。计时器是规范的解决方案。 啊那个;每 100 次迭代或类似的改变颜色。 那么不同的处理器速度呢?计时器无疑是消息驱动设置中的最佳解决方案。【参考方案4】:

如果您希望以动画方式显示系统当前正在工作的颜色,您可能希望使用 QApplication::setOverrideCursor 来显示 waitCursor,或者改为使用 QProgressDialog。

【讨论】:

以上是关于如何在处理时更改 GUI的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 NetBeans GUI Designer Preview 中的外观?

Swing GUI 在数据处理期间不更新

如何更改图像源,在 GUI 中显示并在之后运行一些代码? [复制]

linux,inotify - 如何订阅?

如何在 Roblox 中打开和关闭 gui?

如果主程序中的值发生更改,如何更改 gui 上项目的颜色