Обновление QProgressDialog с помощью QFuture

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

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

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

  // what goes here?
}

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

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

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


person Alex77    schedule 10.12.2009    source источник


Ответы (1)


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

QFutureWatcher watcher;
QProgressDialog pd(...);
connect(&watcher, SIGNAL(progressValueChanged(int)), &pd, SLOT(setValue(int)));
QFuture f = ...
watcher.setFuture(f);
person TimW    schedule 10.12.2009
comment
Отличный ответ ТимВ. К вашему сведению, вам не хватает & перед watcher в connect(watcher, ...);? - person sstock; 18.02.2010