使用QJSEngine从JavaScript访问Qt API



我使用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

相关内容

  • 没有找到相关文章

最新更新