
Переводим проект 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

И нажимаем Configure Project
Будет запущена проверка и первичная сборка проекта.
Подробности процесса вы можете наблюдать во вкладке - 8 Основные сообщения
Запустим сборку проекта 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;
Попробовали собрать проект;
Исправили ошибки, переписали устаревший код и внесли прочие изменения в код проекта.
Добавить комментарий