c++ - 使用 QJSEngine 从 JavaScript 访问 Qt API

标签 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 的所有 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/

相关文章:

Qt:信号和插槽编辑中没有显示定义的插槽

security - qt应用程序激活

c++ - C++远程读取文件

c++ - MFC中如何在资源链中查找资源?

C++,没有 <vector> 的对象数组

ios - QML 5.3 iOS编译纯QML app

c++ - QJSEngine 删除了我的 QObject,如何在 QJSEngine::newQObject 之后更改所有权?

c++ - 在 QJSEngine 中访问动态属性

c++ - 具有普通 STL 接口(interface)的最大数组,类似于 boost::array