使用QProgressDialog以最小持续时间延迟获得“无限加载”进度条的正确方法

时间:2014-06-10 17:05:25

标签: c++ qt dialog

问题

我正在尝试使用QProgressDialog来显示模式对话框窗口,该窗口显示“无限加载”#39进度条,但也利用了在显示窗口之前可以指定的最小持续时间。我可以使用一些hacky代码来完成它,但是想问一下是否有更正确的方法来做它。

用例

对某些后端服务进行查询,结果可能会很快或可能需要一些时间。如果结果快速返回',例如< 500ms,不应显示任何对话框(以避免屏幕上出现闪烁的对话框)。如果结果需要更多时间',则应出现模态对话框(允许用户可能取消操作等)。

代码

初​​始化

m_progress = new QProgressDialog(this);
m_progress->setWindowModality(Qt::WindowModal);
m_progress->setLabelText("Looking up data...");
m_progress->setMinimumDuration(500);
connect(m_progress, SIGNAL(canceled()), this, SLOT(onProgressCanceled()));

'查找数据'按钮onClicked slot(向后端发送请求并显示对话框)

// HACKY CODE ----------
//
m_progress->setMaximum(100);    // some value != 0 (0 is the value passed to setValue)
m_progress->setValue(0);        // starts the minimum duration timer
m_progress->setMaximum(0);      // set maximum to 0 to get 'infinite loading' progress bar
//
// HACKY CODE ----------

onProgressCanceled slot

m_progress->reset();

onResults方法(处理返回结果的回调)

m_progress->reset();

这是相关代码的全部内容。

黑客攻击的原因是在Qt源代码中有明确的检查:

(d->bar->value() == -1 && progress == d->bar->maximum())

如果最大值设置为0(对于'无限加载')之前,则将值设置为0(启动最小持续时间计时器),然后{{1}简单地回来。 QProgressDialog::setValue初始化为-1,并在调用d->bar->value时重置为-1。这几乎就像是QProgressDialog::reset('无限加载'但最小持续时间延迟)的特定用例被挑选出来。

问题

有没有办法达到相同的效果但却没有使用我错过的hacky代码?我觉得我错过了一些简单的事情。

0 个答案:

没有答案