Qt导入的Javascript资源中如何导入QML模块访问已注册QObject
结论
该操作普遍可行,你遇到的枚举读取失败问题属于JS导入模块的使用误区,并非功能不支持,也没有模块类型限制,Qt 5.12及以上所有版本都可正常实现。
问题根源
你在JS文件中通过.import语法导入后拿到的MyModule是模块命名空间对象,不是你注册的单例实例本身——你通过qmlRegisterSingletonInstance注册的单例实例是挂载在该模块命名空间下的同名成员,直接访问MyModule.DDD当然无法读取到枚举值。
正确实现方式
方式1:主动从导入的模块命名空间取单例实例(全场景通用)
修改something.js代码即可正常访问:
.import org.example.MyModule 1.0 as MyModuleNs // 从模块命名空间取出你注册的单例实例 const MyModule = MyModuleNs.MyModule function doit() { console.log(MyModule, MyModule.DDD) // 正常输出实例和对应枚举值3 }
方式2:直接复用QML上下文(适合非共享JS资源,更简单)
如果你的JS文件没有加.pragma library声明(即普通JS资源),它的运行上下文和导入它的QML文件完全共享,你不需要在JS里单独导入模块,直接使用QML中已经导入的MyModule标识符即可:
// 无需写任何.import导入语句 function doit() { console.log(MyModule, MyModule.DDD) // 用法和QML侧完全一致 }
补充说明
如果是带.pragma library的全局共享JS资源,因为它不和任何QML上下文绑定,只能使用方式1主动导入模块后访问实例,该场景也完全支持。
内容的提问来源于stack exchange,提问作者M.S.
相关产品推荐
相关产品推荐

