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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Oтобразить QDialog в длительном процессе до того как будут запущен его eventloop  (Прочитано 5614 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Январь 19, 2016, 12:30 »

Есть у меня виджет, расширяющий QDialog.

Его надо показывать в "предварительном" виде, пока идет подготовка данных (пара секунд). А потом он наполняется данными, и запускается через exec().

Процесс отображения виджета выглядит так:

Код:
Downloader downloader;

// Предварительный вид
downloader.setAboutText(tr("Images download initting..."));
downloader.show();

... парсинг большого HTML-текста на предмет наличия картинок ...

// Полный вид
downloader.setAboutText(tr("Download images"));
downloader.setReferencesList(downloadReferences);
downloader.exec();


Проблема в том, что "предварительный" вид выглядит на экране как пустая рамка. Не видно about-надписи (QLabel). То есть, show() недостаточно. Надо как-то один раз рядом с вызовом show() обновить вид виджета, не запуская его event loop. Как это сделать?
Записан

Собираю информацию по крупицам
http://webhamster.ru
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Январь 19, 2016, 12:44 »

Код
C++ (Qt)
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
Записан
UVV
Гость
« Ответ #2 : Январь 19, 2016, 13:04 »

Т.е. ответ про QFuture тебе не понравился и ты решил сюда прийти? =)
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Январь 19, 2016, 13:51 »

Как вариант, можно добавить пустой (либо динамический) прогресс диалог на время парсинга
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #4 : Январь 19, 2016, 14:37 »

почему нельзя парсинг в отдельный поток засунуть? после окончания обновить диалог с данными.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #5 : Январь 19, 2016, 16:52 »

почему нельзя парсинг в отдельный поток засунуть? после окончания обновить диалог с данными.

Для того чтобы один раз отобразить окно, городить параллельный поток - это черезчур.

Я уже сделал просто другое немодальное окно QMessageBox, показываю его пока идет парсинг.
Записан

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #6 : Январь 19, 2016, 16:55 »

Т.е. ответ про QFuture тебе не понравился и ты решил сюда прийти? =)

На лоре обычно неадекватные ответы. Я пишу параллельно на несколько форумов, цинично используя коллективный разум.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Bepec
Гость
« Ответ #7 : Январь 19, 2016, 17:19 »

xintrea у вас что то в классе не то видимо.
Обычный QDialog в связке с processEvents работает нормально, окно отрисовывается нормально. Мб у вас в классе происходит отложенная инициализация лейбла?
Код:
dial = new Dialog;
// Предварительный вид
// dial->setAboutText(tr("Images download initting..."));
dial->show();
qApp->processEvents();
for (int i = 0; i<2000;i++)
{
qDebug() << i;
}
dial->exec();
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #8 : Январь 20, 2016, 08:32 »

xintrea у вас что то в классе не то видимо.
Обычный QDialog в связке с processEvents работает нормально, окно отрисовывается нормально.

Нормально все отрисовывается, я не спорю. Создал окно QDialog, вызвал qApp->processEvents(), окно на экране нарисовано полностью.

Проблема дальше возникла другого характера. Есть главное окно программы, поверх него появляется модальное окно добавления записи, и поверх него уже обсуждаемый QDialog. Так вот если с окна добавления записи переключиться на другую программу, а потом вернуться и вызвать QDialog, то этот QDialog появится под окном добавления записи. Немотря на то, что у него родитель - окно добавления записи. Не помогает ни raise(), ни activateWindow() - все равно открывается на заднем плане. Поэтому я забил на эту "предварительную инициализацию окна", и вместо него просто показываю обычный стандартный QDialog. Он тоже поначалу прятался, но помогло принудительное raise(). Причем такое поведение наблюдаю только в Windows, а в Linux все нормально.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Bepec
Гость
« Ответ #9 : Январь 20, 2016, 10:39 »

Это уже интереснее. Захочется обсудить создавайте проектик тестовый и поразбираемся. А раз проблема решена то и темку можно закрыть Веселый
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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