如何阻止CMake为Qt/QML项目的qmldir添加资源首选路径?
解决qt_add_qml_module生成qmldir添加资源首选路径的问题
当你用qt_add_qml_module()构建仅包含外部文件系统中QML文件的项目时,CMake默认会在生成的qmldir里插入prefer : qrc:/xxx这类资源路径行,导致QML引擎优先去Qt资源中查找文件,自然找不到你放在文件系统里的QML文件。这里有两种可靠的解决方法:
方法一:禁用资源路径关联(推荐)
通过设置目标属性QT_QML_MODULE_NO_RESOURCE_TARGET_PATH,直接阻止CMake生成那行prefer语句。在你的qt_add_qml_module()配置后添加以下代码:
qt_add_qml_module(YourModuleName URI YourModuleURI VERSION 1.0 QML_FILES YourQmlFile1.qml YourQmlFile2.qml ) # 关键配置:禁用资源路径偏好设置 set_target_properties(YourModuleName PROPERTIES QT_QML_MODULE_NO_RESOURCE_TARGET_PATH TRUE )
这个属性会告诉CMake不要将QML模块与Qt资源路径绑定,生成的qmldir里就不会出现prefer行,QML引擎会直接从文件系统加载你的QML文件。
方法二:手动过滤qmldir内容
如果方法一在你的Qt版本中不生效(比如部分旧版本Qt),可以在CMake构建流程中手动修改生成的qmldir文件,移除prefer行:
qt_add_qml_module(YourModuleName URI YourModuleURI VERSION 1.0 QML_FILES YourQmlFile1.qml YourQmlFile2.qml ) # 获取生成的qmldir文件路径 get_target_property(QML_FILE_PATH YourModuleName QT_QML_MODULE_QMLDIR) # 读取文件内容并移除prefer行 file(READ "${QML_FILE_PATH}" QMLDIR_CONTENT) string(REGEX REPLACE "prefer : qrc:/[^\n]*\n?" "" QMLDIR_CONTENT "${QMLDIR_CONTENT}") file(WRITE "${QML_FILE_PATH}" "${QMLDIR_CONTENT}")
这种方法是在qmldir生成后直接修改内容,属于兜底方案,优先推荐方法一。
内容的提问来源于stack exchange,提问作者Aschkor
相关产品推荐
相关产品推荐

