Russian Qt Forum
Сентябрь 23, 2024, 10:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: вопрос по QProgressDialog  (Прочитано 6170 раз)
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().
Посоветуйте как сделать правильно.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Июль 20, 2011, 18:32 »

1. Вынести Delay в поток.
2. Вставить в Delay периодический вызов QCoreApllication::processEvents ()

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

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
carpovpv
Гость
« Ответ #2 : Июль 21, 2011, 00:09 »

Добрый день.

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

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

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

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

чтобы и индикатору досталось времени в основном потоке, занятом Delay().
Записан
Fess
Гость
« Ответ #3 : Июль 21, 2011, 06:58 »

К сожалению, автор виджета не сделал отдельный поток для отрисовки.
А может это как раз и правильно? Это ведь всего лишь виджет. Он должен жить в главном потоке, а как сделать так, что форма не висела - дело программиста. В дополнение получаем меньшее потребление ресурсов. Родной прогресс бар ведет себя так же..
Записан
slan
Гость
« Ответ #4 : Июль 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().

Спасибо, посмотрю в его сторону
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Июль 21, 2011, 07:34 »

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

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
slan
Гость
« Ответ #6 : Июль 21, 2011, 07:41 »

Ну, так QProgressDialog у тебя будет модальным, то есть юзверь ничего в главном окне нажать не сможет.
А ведь точно, надо попробовать тогда.Спасибо Улыбающийся
Записан
HEXen
Гость
« Ответ #7 : Июль 25, 2011, 15:56 »

Кроме того, никто не запрещает, если что, перед вызовом Delay блокировать кнопки и всё такое, а после выполнения -- разблокировать...
Записан
slan
Гость
« Ответ #8 : Июль 25, 2011, 16:12 »

Всем спасибо за советы, все решилось вынесением функции в отдельный поток и модальным запуском прогрессдиалога.
p.s. тему не знаю как закрывать, уж не кнопочкой ли Заблокировать снизу слева?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.129 секунд. Запросов: 23.