Comments 6
Виджеты хороши ровно до тех пор, пока вы не столкнётесь с DPI scaling или необходимостью делать анимацию интерфейса. И не стоит забывать, что вся отрисовка виджетов идёт в один поток на CPU.
Безотносительно Qt — это нормальная практика делать стейт машину для интерфейса. В статье реализация, которая решает свои задачи.
Если фронтэнд программист не занимается обычным формошлёпством, то такой подход вполне логичный.
Еще с виджетами гемор работать с "touch screen". То "popup" диалог не работает с touch screen, хотя аналогичный QML отрабатывает нормально, то QListView не различает прокрутку пальцем и нажатие, то к каждому виджету нужно QScroller прикрутить, чтобы "кинетическая" прокрутка работала, хотя опять же QML как-то могут и с мышкой и с "touch screen" из коробки работать. То сам Qt начинает "бажить" с очередной версией, например https://bugreports.qt.io/browse/QTBUG-82355
Вообще в qt довольно просто создается многопоточность. GUI должен быть конечно в одно потоке, но логику работы можно сунуть в другие потоки и связать их через connect.
Для класса Navigator вам не нужен ни Q_OBJECT макрос, ни public slots: с технической строны. Если вам прям для понимания хочется иметь секцию слотов, если без неё вы не разберётесь что это слоты — пожалуйста. Коннекты будут работать прекрасно.
Почему это вообще важно? 1 строчка, добавил макрос и не паришься, «а вдруг вообще я потом сигналы добавлю» — ну лично мне, например, не хочется иметь лишний moc вызов в сборке (и разрастание размера образа из-за доп генерации).
пусть правило для генерации moc.cpp из .h будет всегда, но если макроса нет, то файл будет пустым. Потом все moc файлы можно в unity/amalgamation билд включить для еще большего ускорения.
дефолтные cmake методы из Qt конечно, не получится использовать, но можно быстренько написать что-то подобное:
github.com/mapron/FreeHeroes/blob/master/cmake/targets.cmake#L98
github.com/mapron/FreeHeroes/blob/master/cmake/mocWrapper.cmake.in
Пишем свою навигацию в Qt