Skip to content
Snippets Groups Projects

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) {