Qt6中CMake生成qmldir的prefer字段致单例失效问题求助
问题原因
- 自动生成的
prefer :/MyApplication/路径与实际资源部署位置不匹配。 - 当CMake中设置
RESOURCE_PREFIX /时,QML模块的资源会被部署到:/根路径下,而非:/MyApplication/。prefer字段会强制QML引擎优先去指定路径查找单例,找不到就会触发TypeError: Cannot call method 'connect' of undefined错误。 - Main.qml能正常加载是因为启动代码直接使用了绝对资源路径
qrc:/MyApplication/Main.qml,绕过了prefer的路径优先级限制。
解决方案
提供三种可行方案,可根据项目需求选择:
方案1:移除自定义RESOURCE_PREFIX
修改CMake配置,删除RESOURCE_PREFIX /,使用Qt默认的/qt/qml资源前缀:
set_source_files_properties(Constants.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE) qt_add_qml_module(MyApplication URI MyApplication VERSION 1.0 QML_FILES Main.qml Constants.qml )
此时自动生成的prefer路径会变为:/qt/qml/MyApplication/,与实际资源部署路径匹配,单例可被正常识别。
方案2:禁用自动生成prefer字段
通过CMake属性强制不生成prefer行,保持和手动编写qmldir一致的行为:
set_source_files_properties(Constants.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE) qt_add_qml_module(MyApplication URI MyApplication VERSION 1.0 RESOURCE_PREFIX / QML_FILES Main.qml Constants.qml ) # 添加该属性,禁止生成prefer路径配置 set_target_properties(MyApplication PROPERTIES QT_QML_MODULE_NO_PREFER_PATH TRUE)
方案3:调整启动加载路径
修改启动代码,使用与prefer路径匹配的资源路径加载Main.qml(需确保QML引擎已正确导入模块):
// 先导入MyApplication模块 engine->importModule("MyApplication", QQmlModuleImportVersion{1, 0}); // 使用根路径下的Main.qml engine->load("qrc:/Main.qml");
该方案需要同步调整资源文件的部署结构,推荐优先使用前两种方案。
内容的提问来源于stack exchange,提问作者juzzlin
相关产品推荐
相关产品推荐

