使用QJSEngine从JavaScript访问Qt API

时间:2016-10-01 16:57:30

标签: c++ qt qjsengine

我正在使用QJSEngine来创建应用程序脚本。我希望JavaScript方能够修改用户界面。我现在的主要问题是从JavaScript访问Qt API。

要创建小部件,我添加了使用QUILoadercreateWidget()包装器:

// 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而失败。我再次错过了一些注册所有内容的初始化函数调用吗?

1 个答案:

答案 0 :(得分:1)

我建议使用QQmlEngine代替QJSEngine

是从QJSEngine派生的,所以它可以在同一个模块中执行相同的操作,因此没有额外的依赖。

它提供了一种在QML中注册实例化类型的简单方法,具有插件加载机制(导入)等。

我在2015年Qt世界峰会上的演讲中提出了这一点:https://www.youtube.com/watch?v=7LsKoVrb8C8