Tutorial Notes Help

在qt6中如何使用cmake+qml创建模块(纯qml)

如题所说,这个问题困扰了我两天,最后在YouTube的帮助下解决了!

解决方法其实很简单,使用qt_add_qml_module()创建模块就行。其中URI就是模块的ID。

如果各位使用了qt_add_qml_module()后依然不能创使用模块的话,那就像我一样给模块单独添加静态库,然后链接到主程序就行(未测试不添加库能否使用,建议加上)

  • 需要注意的是,即使能正常使用也需要加入QML_IMPORT_PATH这个变量,不然import Style的时候会有下划线报错....另外,在设置QML_IMPORT_PATH变量的时候需要加入FORCE,不然或许没法用...

  • 需要注意的是, QML_IMPORT_PATH设置的路径需要为自动生成的qmldir的路径,例如build目录,不然编辑器还是会找不到模块.... ${PROJECT_BINARY_DIR}

  • 另外, target_link_libraries内链接的插件,需要是这个格式的: ${MODULE_TARGET_NAME}plugin例如: appThemeplugin

  • 最后需要提的一点是模块名称应该跟模块文件夹的名称一样(最好一样,不然可能没法用)

  • 单例的话,下文中的三处Singleton是必加的

  • 注意!如果需要添加多个模块,应该给他加一个前缀(RESOURCE_PREFIX)!

  • 然后在main.cpp中导入: engine.addImportPath(":/violet-ve.com/imports");

  • 不然可能没法用...(或许是下一个提示的原因,没有测试不加前缀的情况,建议加上以进行最佳实践)

  • 注意!在有多层文件夹的模块中,该模块的URI应该设置为<parentDir>.<module> 。这是官方在qml最佳实践的油管视频中提到的。事实证明,这可以解决QtCreator找不到模块的问题!

  • 如果QtCreator还是提示找不到模块,但是可以正常运行程序,找不到的那个模块也正常,那就检查一下build目录中对应层级下的qmldir.qmltypes在不在,如果在,重启QtCreator试一下,这是其中一个解决方案!!!!

202301291432005
  • 如果没有 .qmltypes ,可以试一下重新构建整个项目看看,一般就会生成了

根目录下的 CMakeLists.txt 内容如下:

... add_subdirectory(Style) set(QML_IMPORT_PATH ${PROJECT_SOURCE_DIR} CACHE STRING "import module" FORCE) ... target_link_libraries(appuntitled PRIVATE Qt6::Quick appThemeplugin) ...

模块目录下的 CMakeLists.txt 内容如下:

... set_source_files_properties(DarkGray.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE) qt_add_library(appTheme STATIC) set_target_properties(appTheme PROPERTIES AUTOMOC ON) target_link_libraries(appTheme PRIVATE Qt6::Quick) qt_add_qml_module(appTheme URI Style VERSION 1.0 # optional RESOURCE_PREFIX /violet-ve.com/imports # optional QML_FILES DarkGray.qml ) ...

模块目录下的 DarkGray.qml 内容如下:

pragma Singleton import QtQuick Item { property int appWidth: 500 }

根目录下的 main.qml 内容如下:

import QtQuick import QtQuick.Window import QtQuick.Controls import Style Window{ id: root width: DarkGray.appWidth height: 480 visible: true title: qsTr("Hello World") }
Last modified: 16 十一月 2023