-
Notifications
You must be signed in to change notification settings - Fork 570
Open
Description
背景: Qt6.4.3 Qt6.5.3,脚手架生成的Demo程序,把App.qml的根组件从FluLauncher改成别的,比如FluObject、FluLoader等
问题: 单例组件报错,比如qrc:/App.qml:15: TypeError: Property 'navigate' of object [object Object] is not a function
出现概率: 必现
原因分析:
1、CMakeLists.txt里面,调用qt_add_qml_module前没有给文件设置QT_QML_SINGLETON_TYPE属性,导致qt_add_qml_module生成的qmldir没有singleton信息;
2、通过QML_IMPORT_TRACE和QT_DEBUG_PLUGINS打开调试信息。原来根组件用FluLauncher没有问题,是因为FluLauncher.qml里面有最关键的一行import ".",这一行让后续使用FluentUI插件的时候可以正常识别qml文件属性,单例可以识别成TYPE/URL-SINGLETON;改成FluObject后,单例就会从qmldir里面读取并识别成TYPE/URL(因为1里面解释了,qmldir没有singleton信息)
解决方法:
方法一:Qt6项目严格规定根组件必须是FluLauncher;
方法二:修改CMakeLists.txt,在调用qt_add_qml_module给qml文件设置属性,让qt_add_qml_module生成的qmldir是正确的,代码如下:
if (QT_VERSION VERSION_GREATER_EQUAL "6.2")
#如果是Qt6.2版本以上,则使用qt_add_library,qt_add_qml_module函数添加资源文件
if (FLUENTUI_BUILD_STATIC_LIB)
set(FLUENTUI_QML_PLUGIN_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/FluentUI)
endif ()
#在调用qt_add_qml_module前给文件设置单例属性,否则qt_add_qml_module生成的qmldir不会带singleton关键字,导致某些情况FluRouter等单例报错
foreach(qml_file IN LISTS qml_files)
file(READ "${qml_file}" qml_content)
string(REGEX MATCH "pragma[ \t]+Singleton" match_found "${qml_content}")
if(match_found)
message(STATUS " Found singleton: ${qml_file}")
set_source_files_properties(${qml_file}
PROPERTIES
QT_QML_SINGLETON_TYPE TRUE
)
endif()
endforeach()
#后续代码不变
qt_add_library(${PROJECT_NAME} ${LIB_TYPE})
qt_add_qml_module(${PROJECT_NAME}
Metadata
Metadata
Assignees
Labels
No labels