问题
我正在尝试使用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代码?我觉得我错过了一些简单的事情。