0

我正在使用 aQJSEngine使应用程序可编写脚本。我希望 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?

如果没有,那我就有问题了。我可以QWidget用 a 创建 s QUILoader,但我找不到创建其他对象的方法,例如 a QStandardItemModel。我认为所有 Qt 类都已经通过 注册qRegisterMetaType(),但它们不是:QMetaType::type("QStandardItemModel")通过返回失败UnknownType。同样,我是否缺少一些注册所有内容的初始化函数调用?

4

1 回答 1

1

我建议使用 aQQmlEngine而不是QJSEngine.

Is 是从 QJSEngine 派生的,所以它可以在同一个模块中做同样的事情,所以没有额外的依赖。

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

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

于 2016-10-02T09:21:24.377 回答