Qt6使用CMake自定义QML模块

1.项目结构

在这里插入图片描述

2.编写根CMakeLists.text

cmake_minimum_required(VERSION 3.16)

project(test VERSION 0.1 LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 REQUIRED COMPONENTS
    Core
    Qml
    Quick
    Widgets
)

#根据编译的选项创建输出的路径
set(POJECT_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/bin)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
    string(APPEND POJECT_OUTPUT_PATH "/x64")
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
    string(APPEND POJECT_OUTPUT_PATH "/x86")
else()
    message(FATAL_ERROR "Unknown Architecture")
endif()
if(CMAKE_BUILD_TYPE STREQUAL "Release")
    string(APPEND POJECT_OUTPUT_PATH "/release")
elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
    string(APPEND POJECT_OUTPUT_PATH "/debug")
else()
    message(FATAL_ERROR "Unknown CompileMode")
endif()
message("POJECT_OUTPUT_PATH : ${POJECT_OUTPUT_PATH}")

#指定输出路径
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${POJECT_OUTPUT_PATH})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${POJECT_OUTPUT_PATH})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${POJECT_OUTPUT_PATH})

#添加QML模块的搜索路径
function(add_qml_module_path path)
    set(tmp_list ${QML_IMPORT_PATH})
    list(APPEND tmp_list ${path})
    list(REMOVE_DUPLICATES tmp_list)
    set(QML_IMPORT_PATH ${tmp_list} CACHE STRING "Qml module search path" FORCE)
endfunction()

add_subdirectory(${CMAKE_SOURCE_DIR}/LibMyControl)
add_subdirectory(${CMAKE_SOURCE_DIR}/ExeMain)

2.编写QML模块库的CMakeLists.text

set(CURRENT_LIB_NAME MyQmlControl)

qt_add_library(${CURRENT_LIB_NAME} STATIC)

qt_add_qml_module(${CURRENT_LIB_NAME}
    URI "MyControl"
    RESOURCE_PREFIX /qmlModule
    SOURCES
        #a.cpp
    QML_FILES
        qml/MyControl/TestRect.qml
)

add_qml_module_path(${CMAKE_CURRENT_SOURCE_DIR}/qml)

3.编写主程序的CMakeLists.text

set(CURRENT_EXE_NAME TestQmlModule)

add_executable(${CURRENT_EXE_NAME}
    main.cpp
    resource.qrc
)

target_link_libraries(${CURRENT_EXE_NAME} PRIVATE
    Qt6::Core
    Qt6::Qml
    Qt6::Quick
    Qt6::Widgets
    #这里要链接的库名为:qml库的名称 + plugin
    MyQmlControlplugin
)

4.使用qml模块

//main.cpp
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QQuickView view;
    //在setSource前要先使用addImportPath添加path
    //path: "qrc:/" +  你使用qt_add_qml_module创建模块时RESOURCE_PREFIX后的字段
    //如:RESOURCE_PREFIX /qmlModule
    view.engine()->addImportPath("qrc:/qmlModule");
    view.setSource(QUrl("qrc:/main.qml"));
    view.show();
    return a.exec();
}

//main.qml
import QtQuick
import MyControl

Item {
    TestRect {
    }
}

5.解决qt creator报错:找不到模块

在这里插入图片描述
虽然程序可以正常运行了,但qt creator还是会提示找不到我们使用的模块,这样不方便调试,需要如下的操作(和Qt5使用qmake一样):
1.在MyControl目录下创建qmldir文件,内容如下

module MyControl
//依次写上你要暴露出去的qml控件
TestRect 1.0 TestRect.qml

2.向QML_IMPORT_PATH添加路径,能找到包含qmldir文件的文件夹即可,这一步在上面已经完成了,使用add_qml_module_path(${CMAKE_CURRENT_SOURCE_DIR}/qml(这个函数是我定义在主CMakeLists.txt中的)
3.改完后可以CMake一下,然后使用qt creator中:工具->QML/JS->重置代码模型
4.工程链接: https://download.csdn.net/download/m0_49897529/89629945

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邺清璇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值