QApplication как работает любое приложение

Чтобы понять как работает любое приложение надо просто посмотреть код main.cpp (как ни странно...).

Начинается любое приложение (не библиотека) с:

QApplication app(...);

И заканчивается всегда:

app.exec();

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

При выходе из цикла обработки событий приложение завершается.

Сами события из очереди приложения (от ОС) детектируются, преобразуются в понятный для Qt тип QEvent и отсылаются объектам (виджетам) приложения по иерархии создания родитель-потомок.

Далее QEvent события выполняются уже в коде каждого виджета самостоятельно.

О каких виджетах речь? Всегда будет главное окно приложения (виджет). У него нет родителя (QWidget *=0). Это окно обычно создаётся в main.cpp и обязательно до app.exec().

Это либо QDialog, либо QMainWindow. И у всех один родитель QWidget. Но речь не об этом здесь. Далее отрисовка,сайзинг и т.д. уже делает каждый виджет в своем коде самостоятельно.

Нас здесь интересует QApplication. Кстати код там небольшой. Итак в QApplication создается главный поток приложения.

Потом создается QAbstractEventDispatcher под конкретную ОС (рулится дефайнами) и  запускается получение событий от ОС:

 eventDispatcher->startingUp();

Примечательно, что в коде отсылки событий виджетам проверяется какому потоку принадлежит виджет и если событие отсылается виджету, принадлежащему другому потоку, то выдаётся ошибка.

Надо сказать, что если вам надо создать свой фреймворк, то начинать надо с QApplication или как вы там его назовёте.