【问题标题】:how to change GUI while processing如何在处理时更改 GUI
【发布时间】: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

标签: c++ qt user-interface


【解决方案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-ongoing
http://www.qtcentre.org/threads/32416-Update-GUI-from-another-thread
Forcing the Qt GUI to update

【讨论】:

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

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

【讨论】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 2023-02-21
    相关资源
    最近更新 更多