我使用QJSEngine
使应用程序可脚本化。我希望JavaScript端能够修改用户界面。我现在的主要问题是从JavaScript访问Qt API。
createWidget()
包装器,它使用QUILoader
:
// 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
对象,通过Qt API可用?
如果没有,那我就有问题了。我可以用QUILoader
创建QWidget
s,但我找不到创建其他对象的方法,例如QStandardItemModel
。我认为所有Qt类都已经通过qRegisterMetaType()
注册了,但它们不是:QMetaType::type("QStandardItemModel")
通过返回UnknownType
而失败。再一次,我错过了一些初始化函数调用,注册一切?
我建议使用QQmlEngine
而不是QJSEngine
。
它是从QJSEngine派生出来的,所以它可以在同一个模块中做同样的事情,所以没有额外的依赖。
它提供了一种简单的方法来注册在QML中实例化的类型,有一个插件加载机制(导入),等等。
我在2015 Qt世界峰会上的演讲中提到了这一点:https://www.youtube.com/watch?v=7LsKoVrb8C8