Название: вопрос по QProgressDialog Отправлено: slan от Июль 20, 2011, 18:20 Добрый день. Такой вопрос: например есть у меня функция Delay(), которая что-то делает неизвестно сколько времени. На время этого я хочу повесить прогрессдиалог с границами 0, 0, чтобы получить прогресс без границ (чтоб пользователь не подумал что прога повисла). Делаю так:
Код: QProgressDialog *progress = new QProgressDialog("Progress...", "", 0, 0, this); В результате получаю окошко прогрессдиалога, с белым фоном, прогресс бара и лэйбла внутри нет и оно висит пока не выполнится 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 в поток. 1. Не хотелось выносить в отдельный поток, дабы пользователь не принялся по форме тыкать и вызывать повторно функцию. И выполнение проги после вызова Delay зависит от результата её выполнения.2. Вставить в Delay периодический вызов QCoreApllication::processEvents () И еще, выставляй progress->setValue(0), так прогресс будет бегать туда-сюда :) 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. тему не знаю как закрывать, уж не кнопочкой ли Заблокировать снизу слева? |