主GUI线程在等待QFuture时更新QProgressDialog的正确方法是什么。具体来说,这个循环中的内容:
QProgressDialog pd(...);
QFuture f = ...;
while (!f.isFinished()) {
pd.setValue(f.progressValue());
// what goes here?
}
现在我有一个sleep()就像在那里调用一样,但这不是最佳的(并且当然会引入一些GUI延迟)。
如果我什么也没说,主线程将循环极点pd.setValue(),浪费CPU周期。
我希望放置类似QCoreApplication :: processEvents(flags,maxtime)的内容,但如果事件队列为空则立即返回。我想要一个等待maxtime或者即使队列为空的版本。这样,我得到了延迟,主线程随时准备响应GUI事件。
答案 0 :(得分:14)
使用QFutureWatcher
使用信号和插槽监视QFuture对象。
QFutureWatcher watcher;
QProgressDialog pd(...);
connect(&watcher, SIGNAL(progressValueChanged(int)), &pd, SLOT(setValue(int)));
QFuture f = ...
watcher.setFuture(f);