Предисловие
Добрый день!
В этой статье я расскажу о первых шагах по написанию приложения на Qt.
Я давно запланировала один пет-проект. По мере его создания я планирую выкладывать статьи по шагам и подробным описанием, как я реализовывала разные вещи и с какими сложностями столкнулась.
У меня есть больше 5 лет опыта разработки приложений на qt, но это мой первый собственный проект. Буду рада вашим комментариям и советам. Также буду рада, если эти статьи кому-нибудь пригодятся для разработки своих проектов.
Выбор версий и создание проекта
Первым делом выбираю версию qt и с++.
На момент написания этой статьи самая свежие версии: Qt - 6.10 и C++23, на них и буду разрабатывать проект.
Так как у меня небольшой некоммерческий проект, qt устанавливаю просто с официального сайта https://my.qt.io/download. Если будет необходимость, позже сделаю свою сборку из гита, но пока это будет лишь лишним усложнением.
Возможность запускать под ios и android буду добавлять на более поздних этапах. Это будет описано в статьях с соответствующим названием. Поэтому на данный момент достаточно qtCreator, библиотек qt, git и cmake.
Создаю пустой проект с qml.

Qt Quick Application — действительно быстро.
Выбираю папку, записываю название и получаю базовый cmake проект с интерфейсом на qml.
Запускаю, проверяю что работает.
Создание ресурсов и организация порядка в репозитории
Базовое расположение файлов мне неудобно, поэтому я все сборки помещаю в out, все c++ файлы в src и все qml файлы с qml.
Для изменения расположения build нужно в qtCreator открыть раздел Project, там нажать "Browse.." и выбрать папку.

Для того, чтобы поменять положения qml и src, достаточно их перенести и прописать новые пути в CMakeLists.txt в qt_add_executable для cpp и qt_add_qml_module для qml.
Stack View и страницы
Мобильное приложение, в отличие от десктопного, не имеет окон: мы ограничены одним окном приложения. В окне контент меняется путём переключения страниц.
Базовый способ переключать страницы — это использовать StackView https://doc.qt.io/qt-6/qml-qtquick-controls-stackview.html.
Для этого подключаю import QtQuick.Controls и добавляю в main StackView.
Далее создаю AuthPage.qml и WelcomePage на основе Page. Не забываем про import QtQuick.Controls. И сразу добавляю функции для их добавления в стек.
StackView
{
id: stackView
anchors.fill: parent
}
Component.onCompleted: {
openWelcomePage()
}
function openWelcomePage(){
var component = Qt.createComponent("qrc:/qt/qml/Pages/WelcomePage.qml")
var page = stackView.push(component)
page.continueClicked.connect(function(){
stackView.pop()
openAppPage()
})
}
function openAppPage(){
var component = Qt.createComponent("qrc:/qt/qml/Pages/AuthPage.qml")
stackView.push(component)
}
Также сразу создаю Colors.qml и Sizes.qml. Их надо объявить в mail.qml, чтобы можно было использовать в любом месте.
! Важно создавать базовые компоненты и отдельные классы с цветами и размерами, чтобы позже можно было легко менять стили или даже добавить поддержку нескольких стилей.
Структура qml
С самого начала я решаю выделить 3 qml модуля. Это необязательно для небольших проектов, но помогает не забывать о принципах проектирования, не соблазняться возможностью QML нагенерировать перекрёстные ссылки и после не утонуть в зависимостях.

По принципу YAGNI(You Aren’t Gonna Need It) Я создаю лишь то, что мне нужно для моей ближайшей задачи. Сделать AuthPage и WelcomePage. Позже количество модулей может увеличиться.
Модуль стилей будет содержать сиглтоны с readonly property, позже, когда буду делать динамическую смену тем, их можно будет определять не константами, а функциями, например, со switch в зависимости от темы.
Модуль стилизованных компонентов будет содержать компоненты, что я использую на страницах, такие как кнопки, свитчеры, текстовые поля
Модуль страниц будет содержать страницы.
Главный модуль пока что содержит только main, в котором стек и навигация.
В честь знакомства с qt6.10 Модули я создала, используя qt_add_qml_module.
Для этого нужно:
-
Каждый модуль объявить через свой qt_add_qml_module. Пример:
qt_add_qml_module(Components URI Components VERSION 1.0 QML_FILES NLButton.qml NLText.qml NLTextField.qml ) -
Прописать зависимости qt_add_qml_module(Components
qt_add_qml_module(Components URI Components DEPENDENCIES Styles -
Также прописать зависимости в target_link_libraries под qt_add_qml_module
target_link_libraries(Components PRIVATE Styles ) Если объявляем несколько qt_add_qml_module в одном cmake файле, то нужно явно указать OUTPUT_DIRECTORY, например, в "${CMAKE_CURRENT_BINARY_DIR}/qml/Components"
-
Если в модуле будут синглтоны, то добавляем к файлам соответствующее проперти
set_source_files_properties( Colors.qml Typography.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE ) qt_add_qml_module(Styles URI Styles VERSION 1.0 QML_FILES Colors.qml Typography.qml )Также в самих файлах в начале прописываем
pragma Singleton -
Чтобы работала подсветка указываем путь до модулей в QML_IMPORT_PATH
set_target_properties(${APP_TARGET_NAME} PROPERTIES QML_IMPORT_PATH "${CMAKE_CURRENT_BINARY_DIR}/qml" ) -
Для работы рантайма не забываем добавить импорт в main.cpp
engine.addImportPath(QStringLiteral("%1/qml").arg(QCoreApplication::applicationDirPath())); Пишем в файле qml
import Components 1.0. и всё работает.
Первые шаги в создание своего UI
Если пытаться делать интерфейс, полагаясь на интуицию, будет потрачено куча времени, а результат всё равно будет так себе. Я не дизайнер, но для создания своего приложения хоть какой-то дизайн сделать придётся.
Для этого использую фигму figma.com. Там есть база для первых страниц и удобно менять и подбирать дизайн на свой вкус. Создаю там первые 2 страницы.
Также после дня изучения узнала вопроса по цветам, создаю свою палитру.
Мне понравилось описание палитры на сайте https://m3.material.io/styles/color/roles его и взяла себе.
Для поиска цветов использовала сайт https://uicolors.app/. Там можно задать primary цвет и получить примерный вид приложения и + оттенки цвета.
Далее дело техники, используя стили, делаю компоненты, затем их располагаю на страницах.
UI первых страниц готов!
В следующей статье:
Следующей шагом планирую создать основу для сервера и реализовать простую авторизацию, при помощи которой, по паролю и логину буду получать токен.
Сервер будет сохранять пользователей и отдавать токены.
Комментарии (2)

eoanermine
09.01.2026 15:03Добро пожаловать на Хабр.
Поставил плюс, но Вы рассказываете для новичков о первых шагах, и вместе с тем ваши шаги невозможно воспроизвести: Вы не приводите код WelcomePage.qml, AuthPage.qml, NLButton.qml и прочего. Или вот пишите «UI первых страниц готов!», а UI не показываете :(
Также не понятно, что для чего вы делаете: о замысле приложения ноль слов. Для чего AuthPage; для чего WelcomePage; зачем вообще NLButton и другие, почему не обойтись дефолтными компонентами?
Это сильно портит впечатление. Успехов Вам в написании будущих статей!
Emelian
Поскольку автор ничего не пишет об идее и концепции своего будущего приложения, то приходится додумывать за него.
Типа, ребята, я хочу сделать кросплатформу, на самом крутом средстве разработки, ориентированном, в основном, на создание мобильного приложения, которое будет чего-то там делать.
Например, это может быть простейшая игра, вроде, «балды», либо какая-нибудь простая обучалка, по типу: Назовите рецепт «очень ленивых голубцов». Правильный ответ: «Капуста на балконе, а фарш в морозилке.». Это, когда жена отвечает мужу, что ему поесть?
Я, конечно, могу ошибаться, но, похоже, автор держит интригу, чтобы раньше времени не разочароваться.
А так, Qt – штука безусловно хорошая, но уж больно громоздкая. Скажем, приложение на нём «MediaDownloaderQt5-5.4.3», которое скачивает видосики с «народного» видеохостинга, занимает, в бинарниках, всего лишь, несколько сотен мегабайт. Но, туже саму работу, в принципе, можно сделать и с помощью кода на «простом» C++ / WTL, размером менее 300 килобайт (см. статью: «Минималистский графический интерфейс, на C++ / WTL, для консольного загрузчика» в https://habr.com/ru/articles/955838/ ). Подумаешь, на Qt размер получается в 1000 (!) больше, зато там «крутой интерфейс»!
Кстати, об интерфейсе в Qt. В свое время, я интересовался им из-за наличия в нем самого крутого опенсорсного грида. Но, к сожалению, он «плоский», т.е., не поддерживает группы. Их, слегонца поддерживает контрол «ListCtrl» от M$, но, как-то коряво. Зато, в «семерке» («1С77») группы элементов справочника реализованы ещё более 20 лет назад (на MFC). И с тех пор я ни разу не встречал опенсорса с ними (хороший пример – каталоги в «TotalCommander»). Да, их можно наваять самому и я собирался делать это, но, пока работал на собственной системе учета на производственном предприятии. А когда фирму ликвидировали, то и стимул пропал.
Вот, лично я большой сторонник упомянутого C++ / WTL. Пет-проекты пишу на нём. Последний, это обучающая система для изучения иностранных языков. Она уже вполне выходит на уровень стартпапа.