我正在使用QJSEngine
来创建应用程序脚本。我希望JavaScript方能够修改用户界面。我现在的主要问题是从JavaScript访问Qt API。
要创建小部件,我添加了使用QUILoader
的createWidget()
包装器:
// JavaScript
var w = helpers.createWidget("QPushButton");
// C++
QJSValue helpers::createWidget(QString type)
{
QUILoader ld;
return engine.newQObject(ld.createWidget(type));
}
我还注册了qt_getQtMetaObject()
的所有枚举,这似乎照顾了来自qnamespace.h
的所有命名空间级别的枚举。但它看起来并不像是公共API的一部分。
我真的应该手动这个东西还是我错过了什么?是否有registerAllTheThings()
函数可以创建Qt API可用的全局Qt
对象?
如果没有,那我就有问题了。我可以使用QWidget
创建QUILoader
,但我找不到创建其他对象的方法,例如QStandardItemModel
。我认为所有Qt类都已经通过qRegisterMetaType()
进行了注册,但它们不是:QMetaType::type("QStandardItemModel")
因返回UnknownType
而失败。我再次错过了一些注册所有内容的初始化函数调用吗?
答案 0 :(得分:1)
我建议使用QQmlEngine
代替QJSEngine
。
是从QJSEngine派生的,所以它可以在同一个模块中执行相同的操作,因此没有额外的依赖。
它提供了一种在QML中注册实例化类型的简单方法,具有插件加载机制(导入)等。
我在2015年Qt世界峰会上的演讲中提出了这一点:https://www.youtube.com/watch?v=7LsKoVrb8C8