阻止 QProgressDialog 使停靠图标反弹
Posted
技术标签:
【中文标题】阻止 QProgressDialog 使停靠图标反弹【英文标题】:Stop QProgressDialog from making dock icon bounce 【发布时间】:2011-12-07 15:53:36 【问题描述】:我的应用程序中有一个函数,它根据配置调用各种子函数。每个子函数都是计算密集型的,所以我添加了一个回调来更新模态 QProgressDialog 的状态。每个子函数都显示 0-100% 完成自身而不是父函数。
如果子功能之间的对话框关闭并且窗口没有焦点,则停靠图标会反弹。如果由于用户出于某种原因将注意力转移开,还有更多的子功能剩余,这可能会非常烦人!
当 QProgressDialog 在没有焦点的情况下关闭时,有没有办法禁用图标弹跳?
【问题讨论】:
【参考方案1】:如果我理解正确,那么您描述的场景(即使“正确”工作)会导致我的一个烦恼。也就是:一个进度条到达终点,然后从 0% 重新开始。我宁愿一个软件只说“工作......”而不是故意给我一个误导性的进度条!
为什么不把你的进度条分成几个阶段,然后给每个子功能分配一段进度条呢?在最简单的情况下,如果您有两个持续时间相等的阶段,您可以让第一个阶段从 0 到 50,然后让第二个阶段从 50 到 100。这样您只需放置和取下进度条一次.
如果您的情况很复杂,您需要做一些预先计算来划分进度范围(以及一些面向比率的数学)。但即使是粗略的近似,即进度条以从 0 到 100 的不规则速度前进,也比让它继续重新开始要好!
假设有三个阶段。第一个需要一分钟,第二个需要两分钟,第三个需要半小时。当然——看到它在三分钟后完成 66.6%,然后看着它在半小时内慢慢地通过最后的 33.3%,这会有点奇怪。但这并不像回到零那么糟糕。此外,您应该能够比这更好地估计。即使某些东西是任意变化的(例如早期阶段读取的数字 N 会极大地影响后期阶段)......你不能预先扫描吗?分配扫描可能有 5% 的时间,然后从那里开始。
【讨论】:
我同意你的观点;但是 QProgressDialog 有一个 QLabel 并且对于每个子函数,文本都会更新以显示正在发生的事情,因此看起来相同的任务不会从 0% 重新开始。我的方法的原因是处理组合阶段的复杂性。对于某些功能,我可以预测所需的时间并将其放入对话框中,但仅限于功能启动之后。 @koan QProgressDialog 有一个setLabel()
函数,因此它可以在运行时更改,您不必关闭并重新打开它。相信我——即使您只是猜测要为每个阶段分配多少范围,重新启动进度条也是一种改进。不这样做是基于非常有缺陷的信念。也就是说,不知何故,让 N 个进度条以稍微更线性的方式进行比一个单调增加的进度条要好。 en.wikipedia.org/wiki/Monotonic_function
正如我上面所说,我在运行时更新标签文本以显示当前子功能。我在 Apple 人机界面指南中找不到任何内容说您不应该重置进度。我可能需要调用大量子函数。我可以在您的观点中看到价值,但由于需要进行重大重写,所以现在我更愿意禁用弹跳停靠图标。
@koan 随机文档中没有对实践的批评(由我不尊重其实践、控制心态和诉讼文化的公司)并不能使它成为好的软件设计。除此之外......如果您坚持忽略我的常识论点,为什么不只是重新寻找零并重用您拥有的对话框,而不是关闭并重新打开它?或者关闭自动关闭并使用重置,我猜:doc.qt.nokia.com/latest/qprogressdialog.html#reset
关闭自动关闭已经足够接近我想要达到的结果了。 @HostileFork 如果您将此作为单独的答案提交,那么我会接受。谢谢【参考方案2】:
如果您设置QProgressDialog::setAutoClose(false)
,进度对话框将在子功能之间保持打开状态并停止停靠图标弹跳。
【讨论】:
以上是关于阻止 QProgressDialog 使停靠图标反弹的主要内容,如果未能解决你的问题,请参考以下文章