Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: slan от Июль 20, 2011, 18:20



Название: вопрос по QProgressDialog
Отправлено: slan от Июль 20, 2011, 18:20
Добрый день. Такой вопрос: например есть у меня функция Delay(), которая что-то делает неизвестно сколько времени. На время этого я хочу повесить прогрессдиалог с границами 0, 0, чтобы получить прогресс без границ (чтоб пользователь не подумал что прога повисла). Делаю так:
Код:
QProgressDialog *progress = new QProgressDialog("Progress...", "", 0, 0, this);
progress->setWindowModality(Qt::WindowModal);
progress->setCancelButton(false);
progress->setValue(1);
Delay();
progress->close();
delete progress;

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


Название: Re: вопрос по QProgressDialog
Отправлено: Пантер от Июль 20, 2011, 18:32
1. Вынести Delay в поток.
2. Вставить в Delay периодический вызов QCoreApllication::processEvents ()

И еще, выставляй progress->setValue(0), так прогресс будет бегать туда-сюда :)


Название: Re: вопрос по QProgressDialog
Отправлено: carpovpv от Июль 21, 2011, 00:09
Добрый день.

Для таких случаев я использую такой индикатор.

http://qt-apps.org/content/show.php/QProgressIndicator?content=115762

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

К сожалению, автор виджета не сделал отдельный поток для отрисовки.
Можно периодически вызывать qApp->processEvents();

чтобы и индикатору досталось времени в основном потоке, занятом Delay().


Название: Re: вопрос по QProgressDialog
Отправлено: Fess от Июль 21, 2011, 06:58
К сожалению, автор виджета не сделал отдельный поток для отрисовки.
А может это как раз и правильно? Это ведь всего лишь виджет. Он должен жить в главном потоке, а как сделать так, что форма не висела - дело программиста. В дополнение получаем меньшее потребление ресурсов. Родной прогресс бар ведет себя так же..


Название: Re: вопрос по QProgressDialog
Отправлено: slan от Июль 21, 2011, 07:33
1. Вынести Delay в поток.
2. Вставить в Delay периодический вызов QCoreApllication::processEvents ()

И еще, выставляй progress->setValue(0), так прогресс будет бегать туда-сюда :)

1. Не хотелось выносить в отдельный поток, дабы пользователь не принялся по форме тыкать и вызывать повторно функцию. И выполнение проги после вызова Delay зависит от результата её выполнения.
2. Не получится, Delay находится в dll.



Добрый день.

Для таких случаев я использую такой индикатор.

http://qt-apps.org/content/show.php/QProgressIndicator?content=115762

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

К сожалению, автор виджета не сделал отдельный поток для отрисовки.
Можно периодически вызывать qApp->processEvents();

чтобы и индикатору досталось времени в основном потоке, занятом Delay().

Спасибо, посмотрю в его сторону


Название: Re: вопрос по QProgressDialog
Отправлено: Пантер от Июль 21, 2011, 07:34
1. Не хотелось выносить в отдельный поток, дабы пользователь не принялся по форме тыкать и вызывать повторно функцию. И выполнение проги после вызова Delay зависит от результата её выполнения.
Ну, так QProgressDialog у тебя будет модальным, то есть юзверь ничего в главном окне нажать не сможет.


Название: Re: вопрос по QProgressDialog
Отправлено: slan от Июль 21, 2011, 07:41
Ну, так QProgressDialog у тебя будет модальным, то есть юзверь ничего в главном окне нажать не сможет.
А ведь точно, надо попробовать тогда.Спасибо :)


Название: Re: вопрос по QProgressDialog
Отправлено: HEXen от Июль 25, 2011, 15:56
Кроме того, никто не запрещает, если что, перед вызовом Delay блокировать кнопки и всё такое, а после выполнения -- разблокировать...


Название: Re: вопрос по QProgressDialog
Отправлено: slan от Июль 25, 2011, 16:12
Всем спасибо за советы, все решилось вынесением функции в отдельный поток и модальным запуском прогрессдиалога.
p.s. тему не знаю как закрывать, уж не кнопочкой ли Заблокировать снизу слева?