No history yet

Современная инфраструктура Qt 6

Модернизация вашего проекта Qt

С выходом Qt 6 подход к использованию CMake кардинально изменился. Ушли в прошлое громоздкие скрипты и ручная настройка переменных. Современный CMake для Qt 6 делает ставку на автоматизацию, ясность и переносимость. Вместо того чтобы вручную указывать пути и управлять инструментами вроде moc или uic, мы теперь полагаемся на встроенные механизмы, которые делают код сборки чище и надежнее.

Автоматическая настройка

Ключевая команда, с которой начинается современный проект на Qt 6, — это qt_standard_project_setup. Она выполняет несколько важных задач:

  • Настраивает политики CMake: Устанавливает современные политики, обеспечивая предсказуемое поведение системы сборки.
  • Задает пути установки: Автоматически конфигурирует стандартные пути установки с помощью модуля GNUInstallDirs. Это гарантирует, что ваше приложение будет установлено в правильные каталоги (/usr/local/bin, /usr/local/lib и т.д.) в Unix-подобных системах.
  • Включает AUTOUIC, AUTOMOC и AUTORCC: Эти переменные больше не нужно выставлять вручную. Команда активирует их по умолчанию, и CMake автоматически запускает компилятор метаобъектной информации (moc), компилятор интерфейсов (uic) и компилятор ресурсов (rcc), когда это необходимо.
# Указываем минимальную версию CMake и объявляем проект
cmake_minimum_required(VERSION 3.16)
project(MyQt6App VERSION 1.0 LANGUAGES CXX)

# Включаем стандартную настройку для проектов Qt
qt_standard_project_setup()

Это все, что нужно для базовой инициализации. Больше никаких set(CMAKE_AUTOMOC ON). Теперь разберемся, как подключать сами модули Qt.

Поиск и подключение компонентов

Для поиска установленных компонентов Qt используется команда find_package. Она не просто находит библиотеки, но и создает специальные «цели» (targets), которые содержат всю необходимую информацию для компиляции и линковки: пути к заголовочным файлам, флаги компилятора и зависимости.

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

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

Использование целей Qt6::TargetName вместо старых переменных (вроде Qt5_Core_LIBRARIES) — это ключевое отличие. Цели автоматически управляют зависимостями, путями и определениями, что избавляет вас от ручной работы и делает скрипт сборки чище.

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

  • PRIVATE: Зависимость нужна только для сборки самой цели (my_app). Она не будет «наследоваться» другими проектами, которые могут использовать my_app как библиотеку.
  • PUBLIC: Зависимость является частью публичного интерфейса цели. Любой другой проект, который будет линковаться с my_app, также получит эту зависимость (включая заголовочные файлы и определения).

Для исполняемых файлов почти всегда достаточно PRIVATE.

# Указываем стандарт C++ (Qt 6 требует C++17 или новее)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Создаем исполняемый файл из исходников
add_executable(my_app main.cpp MainWindow.h MainWindow.cpp MainWindow.ui)

# Линкуем компоненты Qt с нашим приложением
target_link_libraries(my_app PRIVATE
    Qt6::Core
    Qt6::Gui
    Qt6::Widgets
)

Обратите внимание: MainWindow.ui был добавлен в add_executable. Благодаря автоматической настройке, CMake поймет, что этот файл нужно обработать с помощью uic, и сгенерирует соответствующий заголовочный файл. То же самое произойдет с Q_OBJECT в заголовочных файлах благодаря AUTOMOC.

Quiz Questions 1/4

Какая команда является ключевой для инициализации современного проекта на Qt 6 с использованием CMake и автоматизирует настройку политик, путей установки и инструментов, таких как moc и uic?

Quiz Questions 2/4

Верно ли, что в современном CMake-проекте для Qt 6 необходимо вручную устанавливать переменные CMAKE_AUTOMOC, CMAKE_AUTOUIC и CMAKE_AUTORCC в ON?

Этот современный подход делает проекты на Qt 6 с использованием CMake более структурированными и легкими в поддержке.