2009-12-10 7 views
7

Каков правильный путь для основного потока GUI для обновления QProgressDialog в ожидании QFuture. В частности, то, что происходит в этом цикле:Обновление QProgressDialog с QFuture

QProgressDialog pd(...); 
QFuture f = ...; 

while (!f.isFinished()) { 
    pd.setValue(f.progressValue()); 

    // what goes here? 
} 

Прямо сейчас у меня есть сон(), как вызов там, но это не является оптимальным (и, конечно, вносит некоторую задержку GUI).

Если я ничего не ставил, основной поток будет иметь петлю-полюс pd.setValue(), теряя процессорные циклы.

Я надеялся положить что-то вроде QCoreApplication :: processEvents (flags, maxtime), но это немедленно возвращается, если очередь событий пуста. Мне нужна версия, которая ждет до maxtime или что-то еще, даже если очередь пуста. Таким образом, я получаю задержку, и основной поток всегда готов реагировать на события GUI.

ответ

14

Используйте QFutureWatcher для контроля объекта QFuture с использованием сигналов и слотов.

QFutureWatcher watcher; 
QProgressDialog pd(...); 
connect(&watcher, SIGNAL(progressValueChanged(int)), &pd, SLOT(setValue(int))); 
QFuture f = ... 
watcher.setFuture(f); 
+0

Отличный ответ TimW. FYI вам не хватает '&' перед 'watcher' в' connect (watcher, ...); '? – sstock

+0

thx, исправлен код – TimW