LINUX.ORG.RU

Как отобразить QDialog в длительном процессе, до того как будут запущен его eventloop

 , ,


1

1

Есть у меня виджет, расширяющий 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. Как это сделать?

★★★★★

Ответ на: комментарий от Xintrea

High-level APIs that make it possible to write multi-threaded programs without using low-level threading primitives such as mutexes, read-write locks, wait conditions, or semaphores.

Очевидно же. Или ты до сих пор не понял что тебе нужно более одного потока(один главный в котором гуй, второй для обработки данных) для решения своей задачи?

Noob_Linux ★★★ ()
Ответ на: комментарий от Xintrea

Есть еще QCoreApplication::processEvents(); но я как-то не уверен, что сработает, и лучше все-таки использовать QFuture.

CrossFire ★★★★★ ()
Ответ на: комментарий от Noob_Linux

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

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

Чувак, ты не понял, для того чтобы отображать гуй, нужно чтобы целый поток висел в event loop'е. Потому что окно не один раз показывается, а постоянно перерисовывается, поэтому тебе выше и толкуют о том, что нужен отдельный поток для твоего парсинга

EugeneBas ★★ ()
Ответ на: комментарий от Xintrea

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

Отдельный поток чтобы разблокировать главный цикл. События отрисовки приходят не только из самой программы, а также от оконной системы. Одноразовая отрисовка это полумера и работать в общем случае не будет.

Dendy ★★★★★ ()
Ответ на: комментарий от EugeneBas

Чувак, ты не понял, для того чтобы отображать гуй, нужно чтобы целый поток висел в event loop'е.

Не нужно, проверено на практике. Для одноразовой отрисовки достаточно один раз отрисовать окно. Да, если это окно перекроет другое окно, оно не перерисуется. Но мне это и не нужно. У меня процесс инициализации 1-2 секунды идет. И пользователю нужно на это время хоть что-то показать, чтобы он не думал, что «какая тормознутая программа, ничего в ней не происходит».

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

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

Один вызов moveToThread - это не черезчур. Парсинг же сделан в виде отдельного класса(-ов)?

Suigintou ★★★★ ()
Ответ на: комментарий от Suigintou

Вызовов QCoreApplication::processEvents();, как подсказали выше, можно прямо из парсинга, будет достаточно.

Я уже это сделал, мне достаточно для единичной отрисовки.

Xintrea ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.