Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: klim от Января 27, 2009, 12:19



Название: Перерисовка окна
Отправлено: klim от Января 27, 2009, 12:19
В программе есть операция, которая выполняется достаточно долго. Для того, чтобы пользователь мог контроллировать ход процесса, на форме предусмотрен ProgressBar.
Проблема заключается в том, что если окно сворачивается, а затем разворачиватся (maximize, restore), до окончания этой "длинной операции" окно не перерисовывается. Т.е. оно либо белое (чаще всего), либо там картинка последнего состояния (до сворачивания).
Как это исправить?


Название: Re: Перерисовка окна
Отправлено: kuzulis от Января 27, 2009, 12:31
ну, операцию в отдельный поток наверное вынести


Название: Re: Перерисовка окна
Отправлено: BaltikS от Января 27, 2009, 12:46
qApp->processEvents(); написать в кусках где что то выполняется


Название: Re: Перерисовка окна
Отправлено: klim от Января 28, 2009, 00:03
qApp->processEvents(); написать в кусках где что то выполняется
Посмотрел пример findfiles в assistant'е - не понял принцип действия. Просто внутри цикла нужно вызвать и всё?


Название: Re: Перерисовка окна
Отправлено: BaltikS от Января 28, 2009, 07:31
klim, если у тебя опреации в цикле происходят, то да - самы простой способ, ну можно пойти по более сложному пути и как написал kuzulis вынести операцию в отдельный поток(и).....смотря какая у тебя задача... У каждого способа есть свои "+" и "-"


Название: Re: Перерисовка окна
Отправлено: klim от Января 28, 2009, 12:53
klim, если у тебя опреации в цикле происходят, то да - самы простой способ, ну можно пойти по более сложному пути и как написал kuzulis вынести операцию в отдельный поток(и).....смотря какая у тебя задача... У каждого способа есть свои "+" и "-"
Понятно. Спасибо!

Дописал в цикле qApp->ProcessEvents - скорость выполнения просто впечетляет. Раньше за минуту процентов 50 выполнялось, а теперь и 5-ти нет.


Название: Re: Перерисовка окна
Отправлено: pastor от Января 28, 2009, 12:56
Дописал в цикле qApp->ProcessEvents - скорость выполнения просто впечетляет. Раньше за минуту процентов 50 выполнялось, а теперь и 5-ти нет.

В этом случае выполняйте qApp->ProcessEvents не на каждой итерации, а допустим через 50 итераций. Если этот вариант неподойдет - выносите в отдельный поток.


Название: Re: Перерисовка окна
Отправлено: Dendy от Января 28, 2009, 14:12
Код
C++ (Qt)
QTime time;
time.start();
while ( notFinished )
{
 // make some work
 if ( time.elapsed() > 20 ) // maximum 20 ms for GUI freeze
 {
   time.start();
   progressBar->update();
   QCoreApplication::processEvents();
 }
}