Russian Qt Forum

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



Название: Oтобразить QDialog в длительном процессе до того как будут запущен его eventloop
Отправлено: xintrea от Январь 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. Как это сделать?


Название: Re: Oтобразить QDialog в длительном процессе до того как будут запущен его eventloop
Отправлено: Igors от Январь 19, 2016, 12:44
Код
C++ (Qt)
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);


Название: Re: Oтобразить QDialog в длительном процессе до того как будут запущен его eventloop
Отправлено: UVV от Январь 19, 2016, 13:04
Т.е. ответ про QFuture тебе не понравился и ты решил сюда прийти? =)


Название: Re: Oтобразить QDialog в длительном процессе до того как будут запущен его eventloop
Отправлено: __Heaven__ от Январь 19, 2016, 13:51
Как вариант, можно добавить пустой (либо динамический) прогресс диалог на время парсинга


Название: Re: Oтобразить QDialog в длительном процессе до того как будут запущен его eventloop
Отправлено: kambala от Январь 19, 2016, 14:37
почему нельзя парсинг в отдельный поток засунуть? после окончания обновить диалог с данными.


Название: Re: Oтобразить QDialog в длительном процессе до того как будут запущен его eventloop
Отправлено: xintrea от Январь 19, 2016, 16:52
почему нельзя парсинг в отдельный поток засунуть? после окончания обновить диалог с данными.

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

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


Название: Re: Oтобразить QDialog в длительном процессе до того как будут запущен его eventloop
Отправлено: xintrea от Январь 19, 2016, 16:55
Т.е. ответ про QFuture тебе не понравился и ты решил сюда прийти? =)

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


Название: Re: Oтобразить QDialog в длительном процессе до того как будут запущен его eventloop
Отправлено: Bepec от Январь 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();


Название: Re: Oтобразить QDialog в длительном процессе до того как будут запущен его eventloop
Отправлено: xintrea от Январь 20, 2016, 08:32
xintrea у вас что то в классе не то видимо.
Обычный QDialog в связке с processEvents работает нормально, окно отрисовывается нормально.

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

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


Название: Re: Oтобразить QDialog в длительном процессе до того как будут запущен его eventloop
Отправлено: Bepec от Январь 20, 2016, 10:39
Это уже интереснее. Захочется обсудить создавайте проектик тестовый и поразбираемся. А раз проблема решена то и темку можно закрыть :D