记得之前使用过 qmake 构建项目那时候是手写一行qmldir来注册 QML 单例的。今天在 CMake 构建的项目中寻思也添加一个 QML 单例结果搞了好一会都没整对最后在网上翻了几篇博文才运行成功下面总结一下一、添加单例 QML 文件先新建一个 QML 文件来定义全局状态信号或是属性并在顶部添加pragma Singleton语句pragma Singleton import QtQuick//QtObject是最轻量的对象模型不参与渲染QtObject{signalexp1();//事件信号property color exp2:red;//常用颜色property string exp3;property var exp4:[];/* 共享数据 或是 临时缓存 例如行为栈 */}二、编写 CMakeLists.txt 文件然后在CMakeLists.txt文件中设置 QML 文件属性将指定的 QML 文件的QT_QML_SINGLETON_TYPE设为TRUE即注册为单例类型注一定要在创建 QML 模块前注册set_source_files_properties(Global/AppState.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)//一定要在qt_add_qml_module之前设置qt_add_qml_module(appTest URI Test VERSION1.0QML_FILES main.qml QML_FILES Global/AppState.qml)三、在 QML 文件中调用最后在其他 QML 文件中调用时只要引入模块然后通过使用单例类型名即 QML 文件名即可访问其信号和属性等。常用场景如跨 QML 文件的事件通知与响应//exp.qmlimport QtQuick2.15import Test1.0Rectangle{id:testRec MouseArea{anchors.fill:parent hoverEnabled:true onClicked:{AppState.exp1()}}}//main.qmlimport QtQuick import Test1.0Connections{target:AppState functiononExp1(){console.log(receive)}}统一的状态管理与样式控制//exp.qmlimport QtQuick import Test1.0Rectangle{color:AppState.exp2}四、结语总的来说我认为在 CMake 构建下注册 QML 单例变得更方便简单了而且在其他文件使用时也有了自动补全这点忘记了qmldir 写的也有QML 单例剩下的用法也很多在很多功能上提供了不少便利性也在规范性上提供帮助充分利用还能省下不少冗余代码肯定是值得学习的。