Безверсионные цели CMake (Qt 5.15)

Qt, command, target, cmake

Content

Разработчики Qt работают над тем, чтобы портировать Qt 6 на CMake в качестве внутренней системы сборки. Хотя до Qt 6 еще несколько месяцев, вы уже можете увидеть некоторые преимущества этой работы в Qt 5.15. Кристиан Адам (Cristian Adam) уже писал в блоге об улучшениях в CMake 3.17 и о том, как, например, улучшился AUTOMOC в QT 5.15. Эта статья о том, как вы можете подготовиться к Qt 6 в своих проектах CMake.

Оглядываясь назад: с Qt 4 по Qt 5

Хотя Qt 4 - Qt 5 были в значительной степени совместимы с исходным кодом с точки зрения C++, к сожалению, это не относится к самой интеграции CMake. Иногда вам приходилось адаптировать большую часть кода CMake, в случае интеграции Qt.

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

Проблема: версионные цели и команды

Одна очевидная проблема заключается в том, что в основном все CMake API (цели, переменные, команды), которые предоставляет Qt, содержат в названии основную версию Qt. Это верно даже для очень простых примеров:

cmake_minimum_required(VERSION 3.5)
project(hellotr LANGUAGES CXX)

find_package(Qt5 COMPONENTS Widgets LinguistTools REQUIRED)
qt5_add_translation(QM_FILES hellotr_en.ts)
add_executable(hellotr
  main.cpp
  ${QM_FILES}
)
target_link_libraries(hellotr Qt5::Widgets)

Теперь вы можете утверждать, что, при условии, что фактическая семантика не изменяется, замена всех вызовов Qt5::, qt5_ в вашем файле CMake на Qt6::, qt6_ достаточно проста. Однако это не поможет вам, если вы хотите какое-то время поддерживать Qt 5 и Qt 6.

Безверсионные цели и команды

Итак, позвольте вам представить новые безверсионные цели и команды в Qt 5.15. Приведенный выше пример можно записать так:

cmake_minimum_required(VERSION 3.5)
project(hellotr LANGUAGES CXX)

find_package(Qt5 5.15 COMPONENTS Widgets LinguistTools REQUIRED)
qt_add_translation(QM_FILES hellotr_en.ts)
add_executable(hellotr
  main.cpp
  ${QM_FILES}
)
target_link_libraries(hellotr Qt::Widgets)

За исключением вызова find_package это должно работать и для Qt 6.

Если вас интересует дополнительный аргумент 5.15 для find_package: это позволяет CMake вывести ошибку с соответствующим сообщением об ошибке, если ваша версия Qt старше Qt 5.15.

Вы можете отказаться от этих новых целей и команд, установив переменные QT_NO_CREATE_VERSIONLESS_TARGETS или QT_NO_CREATE_VERSIONLESS_FUNCTIONS перед find_package. Это полезно, например, если вы уже определили их сами или, если вы все ещё хотите получить доступ к qt_wrap_cpp в Qt 3.

Смешивание Qt 5 и Qt 6

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

Для этих случаев вы можете задать для новой переменной QT_DEFAULT_MAJOR_VERSION значение 5 или 6. Если эта переменная установлена перед вызовом find_package, загружающим Qt 5 или Qt 6, безверсионные функции будут использовать логику из соответствующей версии Qt.

Перспективы на будущее

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

В Qt 6 увидим гораздо больше API, чтобы не только использовать модули Qt, но также и то, как определять ваши собственные модули Qt и плагины.

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
Support the author Donate

Comments

Only authorized users can post comments.
Please, Log in or Sign up
How to become an author?

Contribute to the evolution of the EVILEG community.

Learn how to become a site author.

Learn it
Donate

Good day, Dear Users!!!

I am Evgenii Legotckoi, developer of EVILEG. And it is my hobby project, which helps to learn programming another programmers and developers

If the site helped you, and you want also support the development of the site, than you can donate by following ways

PayPalYandex.Money
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting Timeweb
June 5, 2020, 11:20 p.m.
Aleksej

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:60points,
  • Rating points-1
June 5, 2020, 11:15 p.m.
Aleksej

C++ - Test 001. The first program and data types

  • Result:53points,
  • Rating points-4
V
June 5, 2020, 4:47 p.m.
Vladzo

C++ - Test 005. Structures and Classes

  • Result:83points,
  • Rating points4
Last comments
June 5, 2020, 10:52 a.m.
progammist

Распознавание изображений на Python с помощью TensorFlow и Keras

Огромное спасибо за метериал, по-больше бы подобных статей (с подробным описанием работы и примерами применения) на тему современных технологий. Вопрос поразмышлять. На текущий момент реал…
June 5, 2020, 1:39 a.m.
Evgenij Legotskoj

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

По-моему, смысла в этом нет особого. Если делегат будет игнорировать настройки таблицы, то это приведёт ещё к большему непониманию, что вообще происходит, для программиста, который после вас буд…
June 5, 2020, 1:34 a.m.
IscanderChe

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

Сижу, размышляю: можно ли переписать делегата так, чтобы независимо от настроек строк выделялись строки?
June 5, 2020, 1:31 a.m.
Evgenij Legotskoj

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

Понятно. Я не обратил внимания на то, что там было в старом коде по настройкам строк :)
Now discuss on the forum
s
June 6, 2020, 1:54 a.m.
shuric

Qt/C++ Определение положения курсора над действие(кнопкой) в QToolBar

Доброго дня. Возник вопрос - как можно определить что курсор находится над определенным действием(кнопкой) в qtoolbar ? mainwindow.cpp MainWindow::MainWi…
s
June 6, 2020, 12:45 a.m.
shuric

Qt/C++ особенности QProxyStyle

Да, Вы правы. Код был скопирован с сайта (уже не помню с какого), но решил пойти по пути более легком. Пришлось переписать - кому интересно: использовал stackedWidget для пе…
June 5, 2020, 11:08 p.m.
Aleksej

Посоветуйте новичку (базы данных и Qt, что учить)

Блин, а я недавно купил Шлее Qt 5.10 :( С детства хотел стать программистом, баловался Паскалем, писал простенькие программки на Delphi, создавал движок на php, изучал C (забросил и перешел на п…
June 5, 2020, 1:09 p.m.
IscanderChe

QPlainTextEdit настройка цвета фона

Вечер добрый. Пытаюсь настроить цвет фона QPlainTextEdit следующим образом: CodeEditor::CodeEditor(QWidget *parent) : QPlainTextEdit(parent){ ... QPalette::ColorRole role = bac…
June 5, 2020, 6:13 a.m.
IscanderChe

Фильтр для QtableView sql

Добрый день. Для такой фильтрации необходимо использовать QSortFilterProxyModel. В оффдоках есть хороший пример.
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB