1. qmake プロジェクトを CMake プロジェクトに移行するサンプル
- 1. qmake プロジェクトを CMake プロジェクトに移行するサンプル
1.1. 目的
Qt6に移行したqmakeプロジェクトをCMakeプロジェクトに移行する手順を明確にするため。
1.2. 対応手順
1.2.1. qmake2cmakeをインストールする
1.2.1.1. コマンドプロンプトを起動する
1.2.1.2. qmake2cmake をインストールする
以下のコマンドを実行し、 qmake2cmake をインストールする
python -m pip install qmake2cmake
1.2.2. qmake2cmake を実行し CMakeLists.txt を作成する
以下のコマンドを実行し、CMakeLists.txt を作成する
qmake2cmake_all --min-qt-version 6.5 {対象のプロジェクトフォルダ}
1.2.2.1. 作成される CMakeLists.txt
作成される CMakeLists.txt は以下の通り。
cmake_minimum_required(VERSION 3.16)
project(QQ3DShaderSample VERSION 1.0 LANGUAGES C CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
find_package(QT NAMES Qt5 Qt6 REQUIRED COMPONENTS Core)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Gui Quick Quick3D Widgets)
qt_standard_project_setup()
qt_add_executable(QQ3DShaderSample WIN32 MACOSX_BUNDLE
src/main.cpp
)
target_compile_definitions(QQ3DShaderSample PRIVATE
QT_DEPRECATED_WARNINGS
)
target_link_libraries(QQ3DShaderSample PRIVATE
Qt::Core
Qt::Gui
Qt::Quick
Qt::Quick3D
Qt::Widgets
)
if((QT_VERSION_MAJOR EQUAL 5))
# Resources:
set(qml_resource_files
"qml/Qt5/ColorMapMaterialOperation.qml"
"qml/Qt5/ColorMapOperation.qml"
"qml/Qt5/CustomLineMaterialOperation.qml"
"qml/Qt5/CustomPointMaterialOperation.qml"
"qml/Qt5/DisplayArea3D.qml"
"qml/Qt5/GrayscaleMaterialOperation.qml"
"qml/Qt5/GridMaterialOperation.qml"
"qml/Qt5/Model3DOperation.qml"
"qml/Qt5/main.qml"
"qml/Qt5/qtquickcontrols2.conf"
"qml/Qt5/rendering/ColorMapMaterial.qml"
"qml/Qt5/rendering/CustomLineMaterial.qml"
"qml/Qt5/rendering/CustomPointMaterial.qml"
"qml/Qt5/rendering/GridMaterial.qml"
"qml/Qt5/rendering/colormap.frag"
"qml/Qt5/rendering/colormap.vert"
"qml/Qt5/rendering/customline.frag"
"qml/Qt5/rendering/customline.vert"
"qml/Qt5/rendering/custompoint.frag"
"qml/Qt5/rendering/custompoint.vert"
"qml/Qt5/rendering/gridlines.frag"
"qml/Qt5/rendering/gridlines.vert"
"qml/Qt5/rendering/jet.png"
"qml/Qt5/shaders/colormap.frag"
"qml/Qt5/shaders/colormap.vert"
"qml/Qt5/shaders/grayscale.frag"
"qml/Qt5/shaders/grayscale.vert"
"qml/Qt5/textures/ColorMapMaterial.qml"
"qml/Qt5/textures/GrayscaleMaterial.qml"
"qml/Qt5/textures/jet.png"
)
qt_add_resources(QQ3DShaderSample "qml"
PREFIX
"/"
BASE
"qml/Qt5"
FILES
${qml_resource_files}
)
endif()
if((QT_VERSION_MAJOR EQUAL 6))
# Resources:
set(qml_resource_files
"qml/Qt6/ColorMapMaterialOperation.qml"
"qml/Qt6/ColorMapOperation.qml"
"qml/Qt6/CustomLineMaterialOperation.qml"
"qml/Qt6/CustomPointMaterialOperation.qml"
"qml/Qt6/DisplayArea3D.qml"
"qml/Qt6/GrayscaleMaterialOperation.qml"
"qml/Qt6/GridMaterialOperation.qml"
"qml/Qt6/Model3DOperation.qml"
"qml/Qt6/main.qml"
"qml/Qt6/qtquickcontrols2.conf"
"qml/Qt6/rendering/ColorMapMaterial.qml"
"qml/Qt6/rendering/CustomLineMaterial.qml"
"qml/Qt6/rendering/CustomPointMaterial.qml"
"qml/Qt6/rendering/GridMaterial.qml"
"qml/Qt6/rendering/colormap.frag"
"qml/Qt6/rendering/colormap.vert"
"qml/Qt6/rendering/customline.frag"
"qml/Qt6/rendering/customline.vert"
"qml/Qt6/rendering/custompoint.frag"
"qml/Qt6/rendering/custompoint.vert"
"qml/Qt6/rendering/gridlines.frag"
"qml/Qt6/rendering/gridlines.vert"
"qml/Qt6/rendering/jet.png"
"qml/Qt6/shaders/colormap.frag"
"qml/Qt6/shaders/colormap.vert"
"qml/Qt6/shaders/grayscale.frag"
"qml/Qt6/shaders/grayscale.vert"
"qml/Qt6/textures/ColorMapMaterial.qml"
"qml/Qt6/textures/GrayscaleMaterial.qml"
"qml/Qt6/textures/jet.png"
)
qt_add_resources(QQ3DShaderSample "qml"
PREFIX
"/"
BASE
"qml/Qt6"
FILES
${qml_resource_files}
)
endif()
install(TARGETS QQ3DShaderSample
BUNDLE DESTINATION .
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
qt_generate_deploy_app_script(
TARGET QQ3DShaderSample
FILENAME_VARIABLE deploy_script
NO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})
1.2.2.2. CMakeLists.txt から Qt5 のファイルを削除する
変更後の CMakeLists.txt は以下の通り。
cmake_minimum_required(VERSION 3.16)
project(QQ3DShaderSample VERSION 1.0 LANGUAGES C CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
find_package(QT NAMES Qt5 Qt6 REQUIRED COMPONENTS Core)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Gui Quick Quick3D Widgets)
qt_standard_project_setup()
qt_add_executable(QQ3DShaderSample WIN32 MACOSX_BUNDLE
src/main.cpp
)
target_compile_definitions(QQ3DShaderSample PRIVATE
QT_DEPRECATED_WARNINGS
)
target_link_libraries(QQ3DShaderSample PRIVATE
Qt::Core
Qt::Gui
Qt::Quick
Qt::Quick3D
Qt::Widgets
)
# Resources:
set(qml_resource_files
"qml/Qt6/ColorMapMaterialOperation.qml"
"qml/Qt6/ColorMapOperation.qml"
"qml/Qt6/CustomLineMaterialOperation.qml"
"qml/Qt6/CustomPointMaterialOperation.qml"
"qml/Qt6/DisplayArea3D.qml"
"qml/Qt6/GrayscaleMaterialOperation.qml"
"qml/Qt6/GridMaterialOperation.qml"
"qml/Qt6/Model3DOperation.qml"
"qml/Qt6/main.qml"
"qml/Qt6/qtquickcontrols2.conf"
"qml/Qt6/rendering/ColorMapMaterial.qml"
"qml/Qt6/rendering/CustomLineMaterial.qml"
"qml/Qt6/rendering/CustomPointMaterial.qml"
"qml/Qt6/rendering/GridMaterial.qml"
"qml/Qt6/rendering/colormap.frag"
"qml/Qt6/rendering/colormap.vert"
"qml/Qt6/rendering/customline.frag"
"qml/Qt6/rendering/customline.vert"
"qml/Qt6/rendering/custompoint.frag"
"qml/Qt6/rendering/custompoint.vert"
"qml/Qt6/rendering/gridlines.frag"
"qml/Qt6/rendering/gridlines.vert"
"qml/Qt6/rendering/jet.png"
"qml/Qt6/shaders/colormap.frag"
"qml/Qt6/shaders/colormap.vert"
"qml/Qt6/shaders/grayscale.frag"
"qml/Qt6/shaders/grayscale.vert"
"qml/Qt6/textures/ColorMapMaterial.qml"
"qml/Qt6/textures/GrayscaleMaterial.qml"
"qml/Qt6/textures/jet.png"
)
qt_add_resources(QQ3DShaderSample "qml"
PREFIX
"/"
BASE
"qml/Qt6"
FILES
${qml_resource_files}
)
install(TARGETS QQ3DShaderSample
BUNDLE DESTINATION .
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
qt_generate_deploy_app_script(
TARGET QQ3DShaderSample
FILENAME_VARIABLE deploy_script
NO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})
1.2.3. qt_add_qml_module() を使用するように変更する (推奨)
qmake2cmake で作成された CMakeLists.txt は QMLファイルも含めて qt_add_resources() を使用しているために、 qt_add_qml_module() を使用するように変更する。
この変更は、QMLスクリプトコンパイラを通すために行う。
この変更を行うと、QMLのリソースパスに、URIのパス、およびQMLまでの相対パスが追加されるために、main.cpp の変更も必要となる。
1.2.3.1. 修正後の CMakeLists.txt
修正後の CMakeLists.txt は以下の通り。
cmake_minimum_required(VERSION 3.16)
project(QQ3DShaderSample VERSION 1.0 LANGUAGES C CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
find_package(QT NAMES Qt5 Qt6 REQUIRED COMPONENTS Core)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Gui Quick Quick3D Widgets)
qt_standard_project_setup()
qt_add_executable(QQ3DShaderSample WIN32 MACOSX_BUNDLE
src/main.cpp
)
target_compile_definitions(QQ3DShaderSample PRIVATE
QT_DEPRECATED_WARNINGS
)
target_link_libraries(QQ3DShaderSample PRIVATE
Qt::Core
Qt::Gui
Qt::Quick
Qt::Quick3D
Qt::Widgets
)
# Resources:
# other resource files
set(other_resource_files
"qml/Qt6/qtquickcontrols2.conf"
)
qt_add_resources(QQ3DShaderSample "configuration"
PREFIX
"/"
BASE
"qml/Qt6"
FILES
${other_resource_files}
)
# QML resource files
set(qml_resource_files
"qml/Qt6/rendering/colormap.frag"
"qml/Qt6/rendering/colormap.vert"
"qml/Qt6/rendering/customline.frag"
"qml/Qt6/rendering/customline.vert"
"qml/Qt6/rendering/custompoint.frag"
"qml/Qt6/rendering/custompoint.vert"
"qml/Qt6/rendering/gridlines.frag"
"qml/Qt6/rendering/gridlines.vert"
"qml/Qt6/rendering/jet.png"
"qml/Qt6/shaders/colormap.frag"
"qml/Qt6/shaders/colormap.vert"
"qml/Qt6/shaders/grayscale.frag"
"qml/Qt6/shaders/grayscale.vert"
"qml/Qt6/textures/jet.png"
)
qt_add_resources(QQ3DShaderSample "qml resource"
PREFIX
"/"
BASE
"qml/Qt6"
FILES
${qml_resource_files}
)
# QML files
set(qml_files
"qml/Qt6/ColorMapMaterialOperation.qml"
"qml/Qt6/ColorMapOperation.qml"
"qml/Qt6/CustomLineMaterialOperation.qml"
"qml/Qt6/CustomPointMaterialOperation.qml"
"qml/Qt6/DisplayArea3D.qml"
"qml/Qt6/GrayscaleMaterialOperation.qml"
"qml/Qt6/GridMaterialOperation.qml"
"qml/Qt6/Model3DOperation.qml"
"qml/Qt6/main.qml"
"qml/Qt6/rendering/ColorMapMaterial.qml"
"qml/Qt6/rendering/CustomLineMaterial.qml"
"qml/Qt6/rendering/CustomPointMaterial.qml"
"qml/Qt6/rendering/GridMaterial.qml"
"qml/Qt6/textures/ColorMapMaterial.qml"
"qml/Qt6/textures/GrayscaleMaterial.qml"
)
qt_add_qml_module(QQ3DShaderSample
URI
Qmls
QML_FILES
${qml_files}
)
install(TARGETS QQ3DShaderSample
BUNDLE DESTINATION .
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
qt_generate_deploy_app_script(
TARGET QQ3DShaderSample
FILENAME_VARIABLE deploy_script
NO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})
1.2.3.2. 修正後の main.cpp
修正後の main.cpp は以下の通り。
@@ -25,7 +25,7 @@ int main(int argc, char *argv[])
QQmlApplicationEngine engine;
- const QUrl url(QStringLiteral("qrc:/main.qml"));
+ const QUrl url(QStringLiteral("qrc:/Qmls/qml/Qt6/main.qml"));
QObject::connect(
&engine, &QQmlApplicationEngine::objectCreated, &app,
[url](QObject *obj, const QUrl &objUrl) {
1.2.4. 再利用可能なQMLモジュールの構築 (推奨)
再利用可能なQMLモジュールとするために、 サブディレクトリに CMakeLists.txt を作成し、元の CMakeLists.txt からサブディレクトリの CMakeLists.txt を使用するように変更する。
この変更を行うと、QMLのリソースパスが、URIのパスのみ変更されるために、main.cpp の変更も必要となる。
1.2.4.1. サブディレクトリの qml/Qt6/CMakeLists.txt
サブディレクトリに作成した qml/Qt6/CMakeLists.txt は以下の通り。
# Resources static library:
qt_add_library(Qmls STATIC)
# other resource files
set(other_resource_files
"qtquickcontrols2.conf"
)
qt_add_resources(Qmls "configuration"
PREFIX
"/"
FILES
${other_resource_files}
)
# QML resource files
set(qml_resource_files
"rendering/colormap.frag"
"rendering/colormap.vert"
"rendering/customline.frag"
"rendering/customline.vert"
"rendering/custompoint.frag"
"rendering/custompoint.vert"
"rendering/gridlines.frag"
"rendering/gridlines.vert"
"rendering/jet.png"
"shaders/colormap.frag"
"shaders/colormap.vert"
"shaders/grayscale.frag"
"shaders/grayscale.vert"
"textures/jet.png"
)
qt_add_resources(Qmls "qml resource"
PREFIX
"/"
FILES
${qml_resource_files}
)
# QML files
set(qml_files
"ColorMapMaterialOperation.qml"
"ColorMapOperation.qml"
"CustomLineMaterialOperation.qml"
"CustomPointMaterialOperation.qml"
"DisplayArea3D.qml"
"GrayscaleMaterialOperation.qml"
"GridMaterialOperation.qml"
"Model3DOperation.qml"
"main.qml"
"rendering/ColorMapMaterial.qml"
"rendering/CustomLineMaterial.qml"
"rendering/CustomPointMaterial.qml"
"rendering/GridMaterial.qml"
"textures/ColorMapMaterial.qml"
"textures/GrayscaleMaterial.qml"
)
qt_add_qml_module(Qmls
URI
Qmls
QML_FILES
${qml_files}
)
1.2.4.2. 修正後の CMakeLists.txt
修正後の CMakeLists.txt は以下の通り。
cmake_minimum_required(VERSION 3.16)
project(QQ3DShaderSample VERSION 1.0 LANGUAGES C CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
find_package(QT NAMES Qt5 Qt6 REQUIRED COMPONENTS Core)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Gui Quick Quick3D Widgets)
qt_standard_project_setup()
qt_add_executable(QQ3DShaderSample WIN32 MACOSX_BUNDLE
src/main.cpp
)
target_compile_definitions(QQ3DShaderSample PRIVATE
QT_DEPRECATED_WARNINGS
)
target_link_libraries(QQ3DShaderSample PRIVATE
Qt::Core
Qt::Gui
Qt::Quick
Qt::Quick3D
Qt::Widgets
Qmlsplugin
)
add_subdirectory(qml/Qt6)
install(TARGETS QQ3DShaderSample
BUNDLE DESTINATION .
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
qt_generate_deploy_app_script(
TARGET QQ3DShaderSample
FILENAME_VARIABLE deploy_script
NO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})
1.2.4.3. 修正後の main.cpp
修正後の main.cpp は以下の通り。
@@ -25,7 +25,7 @@ int main(int argc, char *argv[])
QQmlApplicationEngine engine;
- const QUrl url(QStringLiteral("qrc:/Qmls/qml/Qt6/main.qml"));
+ const QUrl url(QStringLiteral("qrc:/Qmls/main.qml"));
QObject::connect(
&engine, &QQmlApplicationEngine::objectCreated, &app,
[url](QObject *obj, const QUrl &objUrl) {