No history yet

Современная архитектура CMake Qt6

Современная архитектура CMake для Qt 6

Для создания профессиональных приложений на Qt 6 с помощью CMake важно придерживаться современных практик. Это обеспечивает чистоту, масштабируемость и кроссплатформенность вашего проекта. Начнем с основ: минимальные требования и подключение модулей Qt.

Любой современный проект Qt 6 требует CMake версии не ниже 3.16 и компилятор с поддержкой стандарта C++17. Первые строки вашего файла CMakeLists.txt всегда будут задавать эти минимальные требования и определять имя проекта. Затем, чтобы использовать компоненты Qt, мы должны их найти с помощью команды find_package. Эта команда ищет установленный фреймворк Qt 6 и проверяет наличие нужных нам модулей, например, Widgets или Core.

cmake_minimum_required(VERSION 3.16)

project(MyQtApp VERSION 1.0
        DESCRIPTION "My First Modern Qt6 App"
        LANGUAGES CXX)

# Находим Qt6 и запрашиваем необходимые компоненты
find_package(Qt6 REQUIRED COMPONENTS Widgets)

После того как CMake нашел Qt, в дело вступает ключевая команда qt_standard_project_setup. Эта команда — сердце современной конфигурации. Она автоматически настраивает множество параметров проекта в соответствии с лучшими практиками Qt 6:

  • Политики CMake: Устанавливает современные политики, избавляя от необходимости делать это вручную.
  • Пути установки: Корректно настраивает пути для развертывания приложения.
  • Автоматизация: Включает переменные AUTOGEN (такие как CMAKE_AUTOMOC, CMAKE_AUTOUIC, CMAKE_AUTORCC), которые автоматически запускают мета-объектный компилятор (MOC), компилятор пользовательского интерфейса (UIC) и компилятор ресурсов (RCC). Это избавляет от ручного вызова этих утилит, что было нормой в старых проектах.

Целеориентированный подход

Современный CMake построен вокруг концепции «целей» (targets). Цель — это, например, ваше приложение или библиотека. Вместо использования глобальных переменных для определения исходных файлов или путей, мы привязываем все свойства непосредственно к цели. Это делает конфигурацию более модульной и понятной.

Для создания цели исполняемого файла Qt 6 предоставляет команду qt_add_executable. Она является оберткой над стандартной командой add_executable, но с дополнительными преимуществами. Например, она автоматически обрабатывает специфичные для Windows настройки, такие как WIN32_EXECUTABLE, избавляя вас от необходимости писать условную логику для разных операционных систем.

# Устанавливает стандартные настройки проекта Qt6
qt_standard_project_setup()

# Создаем цель исполняемого файла
qt_add_executable(my_app
    main.cpp
    mainwindow.cpp
    mainwindow.h
    mainwindow.ui
)

После создания цели ей нужно сообщить, с какими библиотеками она должна быть скомпонована. Для этого используется команда target_link_libraries. Здесь проявляется вся мощь целеориентированного подхода. Мы просто указываем нашу цель (my_app) и цели библиотек Qt, которые мы нашли ранее (Qt6::Widgets).

Важно также указать область видимости зависимости: PRIVATE или PUBLIC.

  • PRIVATE: Ваша цель использует библиотеку, но эта зависимость не передается другим целям, которые могут использовать вашу. Используйте это, если заголовки библиотеки Qt включаются только в ваши .cpp файлы.
  • PUBLIC: Зависимость передается дальше. Используйте это, если вы включаете заголовки библиотеки Qt в публичные заголовочные файлы вашей цели. Для исполняемых файлов разница часто не так важна, но для библиотек это критично.
# Привязываем нашу цель к модулю Qt Widgets
target_link_libraries(my_app PRIVATE Qt6::Widgets)

Собираем все вместе

Теперь давайте посмотрим на полный, но минимальный CMakeLists.txt для простого приложения Qt 6. Он чист, лаконичен и следует всем современным практикам.

# Минимальные требования
cmake_minimum_required(VERSION 3.16)

# Определение проекта
project(MyQtApp LANGUAGES CXX)

# Поиск Qt6 и его компонентов
find_package(Qt6 REQUIRED COMPONENTS Widgets)

# Автоматическая настройка проекта по стандартам Qt6
qt_standard_project_setup()

# Создание цели исполняемого файла с исходниками
qt_add_executable(my_app
    main.cpp
    mainwindow.cpp
    mainwindow.h
    mainwindow.ui
)

# Линковка с модулями Qt
target_link_libraries(my_app PRIVATE Qt6::Widgets)

Этот файл содержит все необходимое для сборки вашего приложения на любой платформе, поддерживаемой Qt и CMake. Он автоматически обработает файлы .ui и заголовки с макросами Q_OBJECT, скомпилирует исходные коды и свяжет все вместе в готовый исполняемый файл.

Lesson image

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

Проверим, насколько хорошо вы усвоили основы.

Quiz Questions 1/5

Каковы минимальные требования к версии CMake и стандарту C++ для современного проекта на Qt 6?

Quiz Questions 2/5

Какая команда в современном CMake для Qt 6 является ключевой для автоматической настройки политик, путей установки и утилит AUTOGEN (MOC, UIC, RCC)?

Теперь вы знаете, как создать чистый и современный проект Qt 6 с помощью CMake. Это основа, на которой строятся даже самые сложные приложения.