Всплывающее окно для индикации каких-то процессов

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

Получается, чтобы по клику мышкой по кнопке открылось окошко индикации какого-то процесса (например какая-то длительная команда работы с оборудованием) надо ПО ЛЮБОМУ открывать окошко индикации через exec() вызов (то есть это будет класс QDialog, но не QWidget) для того , чтобы окно индикации перехватывали события от операционной системы и смогло отрисовываться поверх основного окна приложения.

Только exec диалога  сразу отрисует окно индикации поверх основного окна приложения со всеми новыми изменениями содержания. 

Почему - потому, что окно индикации должно перехватывать все события update, repaint, resizeEvent, timerEvent и т.д.,  которые направляются вашему приложению извне от ОС или изнутри от об'ектов внутри самого приложения 

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

Получается замкнутый круг. И не хочется для реализации этого использовать два потока.

Что же делать?

С помощью Qt мы нашли красивое и удачное решение.

Можно команду процесса запускать отложенно перед exec диалога. Отложенно, то есть например по таймеру или по событию таймера timerEvent (не важно). 

Также перед exec надо установить связь connect сигнала из процесса со слотом окна индикации.

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

После добавления информации в слоте окна индикации надо отрисовать содержание окна заново и получится красивое логгирование в реальном времени.

А если ещё оформить запуск команды как вызов слота по имени у об'екта с передачей параметров типа QVariant и возвращаемым значением QVariant (через invokeMethod), то вообще можно сделать универсальный инструмент для визуального логгирования процессов, отслеживания ошибок в них и т.д.

Примечание: вызов слота делаем не queued, а direct, то есть выполняем не отложенно из очереди событий, а прямо без задержки.

Решение настолько упрощает разработку, что мы незамедлительно переделали все свои коммерческие проекты с использованием этой фишки.

Главная прелесть, что теперь везде где мы хотим в процессе отработать ошибку или показать дополнительную информацию, то есть показать ее в окне индикации, мы только делаем emit сигнала и все. Нам теперь  не надо передавать какие-то ссылки в функции для установки возвращаемых значений. Все банально и просто. Для возврата значений у нас теперь всегда QVariant, в который мы можем обернуть любой класс, любой тип данных.

Все это благодаря метаоб'ектной системе Qt. Данный пример показывает грамотное использование технологии сигнал-слот.

Мы обязательно снимем небольшое видео на эту тему и выложим открытый проект для скачивания.

Всем стабильной работы ваших программ не только на своих компьютерах, но и на всех компьютерах в мире.