Skip to content

Qt6.x部分情况单例组件报错,附解决方法 #609

@N1ckn4mes

Description

@N1ckn4mes

背景: 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

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions