Russian Qt Forum
Июнь 14, 2024, 02:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как отловить момент старта exec() в QDialog?  (Прочитано 3227 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Апрель 10, 2016, 16:25 »

Сделал диалог, унаследованный от QDialog.

Диалог показывает большой набор иконок (несколько разделов по ~1500 иконок). Иконки из одного раздела надо считать с диска, и это занимает около 5 секунд. Поэтому в диалоге предусмотрена процентная линейка, которая показывает процесс загрузки иконок в разделе. И она работает, когда пользователь выбирает тот или иной раздел иконок.

Но возникает проблема с первой отрисовкой диалога. В момент, когда диалог появляется на экране, необходимо загрузить иконки из первого раздела.

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

Вопрос: Как отловить момент старта exec() в QDialog?


PS:

Если запускать загрузку иконок (например сделать метод preloadIcon()) до выполнения exec(), то все работает. За исключением того, что весь интерфейс замирает на 5 секунд, и непонятно что происходит.

И даже если если перед preloadIcon() запустить show(), то тоже непонятно что происходит, ибо виджеты окна диалога не отрисовываются, видна только рамка. Это происходит из-за того, что основной цикл диалога не запущен, а запускается он все тем же exec().

И даже если при обновлении процентной линейки вызывать метод диалога update(), то тоже ничего не отрисовывается. Видимо, тоже потому что еще не запущен основной цикл.


PS2:

Переопределение exec() тоже не помогает. Если сделать так:
Код:
int myDialog::exec()
{
  preloadIcon();
  QDialog::exec();
}
То загрузки не будет видно, потому что основной цикл еще не запущен.

А если сделать так:
Код:
int myDialog::exec()
{
  QDialog::exec();
  preloadIcon();
}
То до preloadIcon() дело не дойдет, ибо будет ожидание завершения QDialog::exec().
Записан

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

Сообщений: 4349



Просмотр профиля
« Ответ #1 : Апрель 10, 2016, 16:31 »

Код
C++ (Qt)
int myDialog::exec()
{
 QMetaObject::invokeMethod( this, "preloadIcon", Qt::QueuedConnection );
 QDialog::exec();
}
 

или можно немного подождать, пока отрисуется диалог:
Код
C++ (Qt)
int myDialog::exec()
{
 QTimer::singleShot( 500, this, SLOT(preloadIcon()) );
 QDialog::exec();
}
 
« Последнее редактирование: Апрель 10, 2016, 17:36 от Old » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #2 : Апрель 10, 2016, 17:05 »

showEvent() еще попробуй
Записан

Изучением 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
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Апрель 11, 2016, 11:19 »

А разве не в поток надо задать загрузку иконок?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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