Среда, 20.12.2023 19:00

Переводим проект Qt на CMake. Миграция с Qt5 на Qt6. Часть 1

Переводим проект Qt на CMake. Миграция с Qt5 на Qt6. Часть 1

С выходом шестой версии Qt перешел на использование CMake по умолчанию, вместо использования QMake. 

Сегодня мы переведем старый проект с использования QMake на новую систему сборки проектов – CMake.

Клонирование проекта

Для начала нам потребуется исходный код старого проекта.

Создадим папку для проекта и откроем её в консоли. 

Выполним команду:

git clone https://gitflic.ru/project/vasiliyaltunin/blog_altuninvv_ru.git

Создадим папку для новых проектов

cd blog_altuninvv_ru
mkdir qt6

Скопируем проекты в новое место

cd qt5
xcopy *.* ..\qt6 /s/e
cd ..\qt6\FloatWindow\Part1\QtFloatWindow\

Новый файл CMakeLists.txt

Создадим файл CMakeLists.txt

Обратите внимание файл должен называться именно так, включая расширение и буквы верхнего и нижнего регистра!

Содержимое файла:

cmake_minimum_required(VERSION 3.21.1)

project(QtFloatWindow VERSION 0.1 LANGUAGES CXX)

set(CMAKE_AUTOMOC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 REQUIRED COMPONENTS Widgets)

qt_standard_project_setup()

qt_add_executable(${CMAKE_PROJECT_NAME}
   floatwindow.h
   floatwindow.cpp
   floatwindow.ui

    mainwindow.h
   mainwindow.cpp
   mainwindow.ui

    main.cpp 
)

target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE Qt6::Widgets)

set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
   WIN32_EXECUTABLE ON
   MACOSX_BUNDLE OFF
)

Запустим Qt Creator. На момент написания статьи у меня установлен QtCreator версии 11.0.3 основанный на Qt 6.6.0.

Выберем пункт меню Файл – Открыть файл или проект и выберем созданный нами файл CMakeLists.txt

Выбираем подходящий комплект, в моем случае это просто Desktop

Конфигурирование проекта Qt6

И нажимаем Configure Project

Будет запущена проверка и первичная сборка проекта.

Подробности процесса вы можете наблюдать во вкладке - 8 Основные сообщения

Работа CMake

Запустим сборку проекта Ctrl+R

Во вкладе 4 Вывод сборки вы найдете подробности процесса сборки:

Прогресс сборки проекта

В нашем случае устарели несколько методов и неправильно описано включение заголовочного файла:

15:06:46: Выполняются этапы для проекта QtFloatWindow...
15:06:46: Запускается: «C:\msys64\mingw64\bin\cmake.exe» --build D:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/build-QtFloatWindow-Desktop-Debug --target all
[1/6 0.8/sec] Automatic MOC and UIC for target QtFloatWindow
[2/6 1.0/sec] Building CXX object CMakeFiles/QtFloatWindow.dir/mainwindow.cpp.obj
FAILED: CMakeFiles/QtFloatWindow.dir/mainwindow.cpp.obj 
C:\msys64\mingw64\bin\g++.exe -DMINGW_HAS_SECURE_API=1 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NEEDS_QMAIN -DQT_WIDGETS_LIB -DUNICODE -DWIN32 -DWIN64 -DWINVER=0x0A00 -D_ENABLE_EXTENDED_ALIGNED_STORAGE -D_UNICODE -D_WIN32_WINNT=0x0A00 -D_WIN64 -ID:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/build-QtFloatWindow-Desktop-Debug/QtFloatWindow_autogen/include -isystem C:/msys64/mingw64/include/qt6/QtCore -isystem C:/msys64/mingw64/include/qt6 -isystem C:/msys64/mingw64/share/qt6/mkspecs/win32-g++ -isystem C:/msys64/mingw64/include/qt6/QtWidgets -isystem C:/msys64/mingw64/include/qt6/QtGui -g -std=gnu++17 -MD -MT CMakeFiles/QtFloatWindow.dir/mainwindow.cpp.obj -MF CMakeFiles\QtFloatWindow.dir\mainwindow.cpp.obj.d -o CMakeFiles/QtFloatWindow.dir/mainwindow.cpp.obj -c D:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/QtFloatWindow/mainwindow.cpp
In file included from D:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/QtFloatWindow/mainwindow.cpp:1:
D:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/QtFloatWindow/mainwindow.h:5:10: fatal error: floatwindow.h: No such file or directory
    5 | #include <floatwindow.h>
      |          ^~~~~~~~~~~~~~~
compilation terminated.
[3/6 1.4/sec] Building CXX object CMakeFiles/QtFloatWindow.dir/main.cpp.obj
FAILED: CMakeFiles/QtFloatWindow.dir/main.cpp.obj 
C:\msys64\mingw64\bin\g++.exe -DMINGW_HAS_SECURE_API=1 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NEEDS_QMAIN -DQT_WIDGETS_LIB -DUNICODE -DWIN32 -DWIN64 -DWINVER=0x0A00 -D_ENABLE_EXTENDED_ALIGNED_STORAGE -D_UNICODE -D_WIN32_WINNT=0x0A00 -D_WIN64 -ID:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/build-QtFloatWindow-Desktop-Debug/QtFloatWindow_autogen/include -isystem C:/msys64/mingw64/include/qt6/QtCore -isystem C:/msys64/mingw64/include/qt6 -isystem C:/msys64/mingw64/share/qt6/mkspecs/win32-g++ -isystem C:/msys64/mingw64/include/qt6/QtWidgets -isystem C:/msys64/mingw64/include/qt6/QtGui -g -std=gnu++17 -MD -MT CMakeFiles/QtFloatWindow.dir/main.cpp.obj -MF CMakeFiles\QtFloatWindow.dir\main.cpp.obj.d -o CMakeFiles/QtFloatWindow.dir/main.cpp.obj -c D:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/QtFloatWindow/main.cpp
In file included from D:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/QtFloatWindow/main.cpp:1:
D:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/QtFloatWindow/mainwindow.h:5:10: fatal error: floatwindow.h: No such file or directory
    5 | #include <floatwindow.h>
      |          ^~~~~~~~~~~~~~~
compilation terminated.
[4/6 1.9/sec] Building CXX object CMakeFiles/QtFloatWindow.dir/QtFloatWindow_autogen/mocs_compilation.cpp.obj
FAILED: CMakeFiles/QtFloatWindow.dir/QtFloatWindow_autogen/mocs_compilation.cpp.obj 
C:\msys64\mingw64\bin\g++.exe -DMINGW_HAS_SECURE_API=1 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NEEDS_QMAIN -DQT_WIDGETS_LIB -DUNICODE -DWIN32 -DWIN64 -DWINVER=0x0A00 -D_ENABLE_EXTENDED_ALIGNED_STORAGE -D_UNICODE -D_WIN32_WINNT=0x0A00 -D_WIN64 -ID:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/build-QtFloatWindow-Desktop-Debug/QtFloatWindow_autogen/include -isystem C:/msys64/mingw64/include/qt6/QtCore -isystem C:/msys64/mingw64/include/qt6 -isystem C:/msys64/mingw64/share/qt6/mkspecs/win32-g++ -isystem C:/msys64/mingw64/include/qt6/QtWidgets -isystem C:/msys64/mingw64/include/qt6/QtGui -g -std=gnu++17 -MD -MT CMakeFiles/QtFloatWindow.dir/QtFloatWindow_autogen/mocs_compilation.cpp.obj -MF CMakeFiles\QtFloatWindow.dir\QtFloatWindow_autogen\mocs_compilation.cpp.obj.d -o CMakeFiles/QtFloatWindow.dir/QtFloatWindow_autogen/mocs_compilation.cpp.obj -c D:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/build-QtFloatWindow-Desktop-Debug/QtFloatWindow_autogen/mocs_compilation.cpp
In file included from D:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/build-QtFloatWindow-Desktop-Debug/QtFloatWindow_autogen/EWIEGA46WW/moc_mainwindow.cpp:9,
                from D:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/build-QtFloatWindow-Desktop-Debug/QtFloatWindow_autogen/mocs_compilation.cpp:3:
D:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/QtFloatWindow/mainwindow.h:5:10: fatal error: floatwindow.h: No such file or directory
    5 | #include <floatwindow.h>
      |          ^~~~~~~~~~~~~~~
compilation terminated.
[5/6 0.9/sec] Building CXX object CMakeFiles/QtFloatWindow.dir/floatwindow.cpp.obj
D:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/QtFloatWindow/floatwindow.cpp: In member function 'virtual void FloatWindow::mousePressEvent(QMouseEvent*)':
D:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/QtFloatWindow/floatwindow.cpp:23:28: warning: 'QPoint QMouseEvent::globalPos() const' is deprecated: Use globalPosition() [-Wdeprecated-declarations]
   23 |     oldPos = evt->globalPos();
      |              ~~~~~~~~~~~~~~^~
In file included from C:/msys64/mingw64/include/qt6/QtGui/QMouseEvent:1,
                from D:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/QtFloatWindow/floatwindow.h:4,
                from D:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/QtFloatWindow/floatwindow.cpp:1:
C:/msys64/mingw64/include/qt6/QtGui/qevent.h:223:19: note: declared here
  223 |     inline QPoint globalPos() const { return globalPosition().toPoint(); }
      |                   ^~~~~~~~~
D:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/QtFloatWindow/floatwindow.cpp: In member function 'virtual void FloatWindow::mouseMoveEvent(QMouseEvent*)':
D:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/QtFloatWindow/floatwindow.cpp:28:40: warning: 'QPoint QMouseEvent::globalPos() const' is deprecated: Use globalPosition() [-Wdeprecated-declarations]
   28 |     const QPoint delta = evt->globalPos() - oldPos;
      |                          ~~~~~~~~~~~~~~^~
C:/msys64/mingw64/include/qt6/QtGui/qevent.h:223:19: note: declared here
  223 |     inline QPoint globalPos() const { return globalPosition().toPoint(); }
      |                   ^~~~~~~~~
D:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/QtFloatWindow/floatwindow.cpp:30:40: warning: 'QPoint QMouseEvent::globalPos() const' is deprecated: Use globalPosition() [-Wdeprecated-declarations]
   30 |                 oldPos = evt->globalPos();
      |                          ~~~~~~~~~~~~~~^~
C:/msys64/mingw64/include/qt6/QtGui/qevent.h:223:19: note: declared here
  223 |     inline QPoint globalPos() const { return globalPosition().toPoint(); }
      |                   ^~~~~~~~~
ninja: build stopped: subcommand failed.
15:06:52: Процесс «C:\msys64\mingw64\bin\cmake.exe» завершился с кодом 1.
Ошибка при сборке/развёртывании проекта QtFloatWindow (комплект: Desktop)
Во время выполнения этапа «Собрать»
15:06:52: Прошло времени: 00:06.

Давайте это исправим.

Откроем файл mainwindow.h и заменим строку

#include <floatwindow.h>

на

#include "floatwindow.h"

Откроем файл floatwindow.cpp и заменим все строки

evt->globalPos()

на 

evt->globalPosition().toPoint()

Запустим сборку проекта Ctrl+R

На этот раз сборка пройдет без ошибок:

15:12:04: Выполняются этапы для проекта QtFloatWindow...
15:12:04: Запускается: «C:\msys64\mingw64\bin\cmake.exe» --build D:/projects/blog_test/blog_altuninvv_ru/qt6/FloatWindow/Part1/build-QtFloatWindow-Desktop-Debug --target all
[1/6 1.1/sec] Automatic MOC and UIC for target QtFloatWindow
[2/6 0.3/sec] Building CXX object CMakeFiles/QtFloatWindow.dir/main.cpp.obj
[3/6 0.4/sec] Building CXX object CMakeFiles/QtFloatWindow.dir/QtFloatWindow_autogen/mocs_compilation.cpp.obj
[4/6 0.6/sec] Building CXX object CMakeFiles/QtFloatWindow.dir/mainwindow.cpp.obj
[5/6 0.7/sec] Building CXX object CMakeFiles/QtFloatWindow.dir/floatwindow.cpp.obj
[6/6 0.6/sec] Linking CXX executable QtFloatWindow.exe
15:12:14: Процесс «C:\msys64\mingw64\bin\cmake.exe» завершился успешно.
15:12:14: Прошло времени: 00:10.

Единственная проблема – вместе с окошком теперь отображается и основное окно:

Первый запуск после сборки проекта

Давайте от него избавимся. Откроем файл main.cpp и закомментируем строку:

w.show();

Запустим сборку проекта Ctrl+R

Теперь отображается только полупрозрачное окошко.

Запуск исправленного проекта

Заключение

Сегодня мы рассмотрели перенос проекта в QtCreator с версии 5.Х на версию 6.6.0:

Создали копию старого проекта;

Создали файл CMakeLists.txt для нашего проекта;

Открыли его в QtCreator;

Попробовали собрать проект;

Исправили ошибки, переписали устаревший код и внесли прочие изменения в код проекта.

Категория Qt6

Добавить комментарий

Простой текст

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Строки и абзацы переносятся автоматически.
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.
Просмотров: 147