我正在使用 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
的所有 namespace 级枚举。不过,它看起来不像是公共(public) API 的一部分。
我真的应该手动处理这些东西还是我遗漏了什么?不是有一个 registerAllTheThings()
函数可以创建全局 Qt
对象,通过该对象可以使用 Qt API 吗?
如果没有,那我就有问题了。我可以使用 QUILoader
创建 QWidget
,但我找不到创建其他对象的方法,例如 QStandardItemModel
.我以为所有 Qt 类都已经通过 qRegisterMetaType()
注册了。 ,但它们不是:QMetaType::type("QStandardItemModel")
因返回 UnknownType
而失败。同样,我是否缺少一些注册所有内容的初始化函数调用?
最佳答案
我建议使用 QQmlEngine
而不是 QJSEngine
。
Is 是从 QJSEngine 派生的,所以它可以在同一个模块中做同样的事情,所以没有额外的依赖。
它提供了一种在 QML 中注册实例化类型的简单方法,具有插件加载机制(导入)等。
我在 2015 年 Qt 世界峰会上的演讲中介绍了这一点:https://www.youtube.com/watch?v=7LsKoVrb8C8
关于c++ - 使用 QJSEngine 从 JavaScript 访问 Qt API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39809232/