问题标签 [qjsengine]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
170 浏览

c++ - 如何将枚举类型注册到 QJSEngine 以从脚本环境中使用?

我已经搜索了几个小时,但我不知道如何从 C++ 端注册枚举类型,以便在使用 QJSEngine 时可以从脚本环境端使用它?

我有一个派生自 QObject 的类,已注册到脚本环境并具有一个将枚举作为参数的函数。我希望能够从脚本环境中调用该函数。

使用 QJSEngine 时,我需要做什么才能从脚本端调用 set()?我已经尝试将 Q_ENUM 调用注释掉,但它似乎没有帮助。

0 投票
0 回答
77 浏览

javascript - 使用 QJSEngine 对我的应用程序有安全影响吗?

我正在使用 QJSEngine 让用户脚本自定义数据在我的应用程序中进行转换。我了解 QJSEngine 没有沙盒化,并且运行在与我的应用程序相同的特权级别。这是否有我需要担心的安全隐患?我没有向 QJSEngine 公开任何应用程序对象。

我尝试了几件事:

打开网址:

读取文件:

访问注册表:

这些都不起作用。那么用户可以从 QJSEngine 内部做些什么讨厌的事情呢?如果是这样,是什么?

0 投票
1 回答
243 浏览

javascript - QJSEngine,全局和脚本,是什么导致语法错误

我正在使用QJSEngine,我向对象添加了一个全局对象:

pobjScriptEng是一个指向 的实例的指针QJSEngine

我有一张全局地图,地图类型定义:

我遍历全局映射,将它们添加到引擎中:

rmpGlobals是对全局映射的引用。

我有一个脚本,其中包含对全局的引用,全局被调用db并且是一个 JSON 对象,其中包含:

我在调用的循环中添加了一些调试日志,setProperty这就是应用程序输出中显示的内容:

语法错误来自 JSON,但为什么它没有任何问题。我转储result.toString()到控制台,它包含:

SyntaxError: 预期的标记 `,'

剧本:

运行我的应用程序并评估脚本时,我在“应用程序输出”中看到以下内容:

忽略之前的所有内容,[js]这是我的时间戳和调试信息,之后[js]是所有控制台输出。

是什么:

SyntaxError: 预期的标记 `,'

我在全局或脚本中看不到任何错误。

如果我修改脚本并插入:

作为第一行,没有显示语法错误,一切正常,那么 global 添加 using 有什么问题setProperty

这是向地图添加全局的代码:

一些定义:

0 投票
1 回答
390 浏览

c++ - QJSEngine - exposing classes and throwing errors

I am trying to create a standard JS library that is mostly shaped like Qbs (which uses deprecated QScriptEngine) with QJSEngine, so people who make Qt software can add things like file-operations to their plugin JS environment.

You can see the repo here

I've got basic classes exposed to the JS engine, like this:

but I can's seem to figure out how to get a reference to the QJSEngine, inside a function, so I can throw an error:

I'd like it if I could somehow derive the calling engine from inside the function, so the class could be exposed to several separate engine instances, for example.

I saw QScriptable and it's engine() method, but couldn't figure out how to use it.

I added

in my qbs file, and

but it still isn't throwing the error with this (just fails silently):

I may be confused about it, too, but it seems like it's using QScriptEngine, which I'm trying to get away from.

What is the best way to accomplish the task of adding a class that QJSEngine can use, which has cpp-defined methods that can throw errors in the calling engine?

0 投票
2 回答
241 浏览

c++ - 使用 QJsEngine 在 Qt 中注册自定义类型

我有一个名为 LObject 的自定义类,我想调用一个方法“test”。我有一个在 QJSEngine 中注册的方法,它返回一个 LObject 的实例。执行该方法时收到错误消息:

我试图用 Q_DECLARE_METATYPE 注册我的类型,但是我不能调用我的 LObject 的方法。

有什么办法呢?

编辑:一个包含 3 个文件的最小示例

服务器.h:

主.cpp:

测试.qml

0 投票
1 回答
68 浏览

qt - 我可以保留传递给 QJSEngine 的 QObject 的所有权吗?

我正在使用 QJSEngine 并绑定一些对象engine.globalObject().setProperty(name, engine.newQObject(obj));

问题是 QJSEngine 析构函数正在调用这些对象的析构函数,但我希望它们比 QJSEngine 对象更长寿。

即使我从 globalObject() 中删除该属性也会发生这种情况。

0 投票
1 回答
128 浏览

c++ - 在脚本调用的 C++ 函数中调用 QJSEngine::newQObject() 是否有效?

考虑这个例子:

ObjectCreator通过以下方式设置为全局属性QJSEngine

JavaScript(engine_从之前的代码片段中评估):

阅读文档我找不到这个问题的答案:

engine_->newQObject()调用通过评估的 JavaScript 脚本调用的 C++ 函数是否有效engine_

0 投票
0 回答
47 浏览

python - 将继承的 QObject 的元对象注册到 QJSEngine

我想继承QObject该类,并将继承类的元对象注册到一个 QJSEngine 实例,以便我可以let instance = new TrialObject();在 JavaScript 中调用。这是我的代码:

当(如上所述),我使用QObject.staticMetaObjectas 时TrialObject,JavaScript 运行良好,并返回QObject给 Python。因此QObject是可调用和工作的。但是当我尝试用 替换QObject.staticMetaObjectAttributeHandler.staticMetaObject,我得到了错误:

TypeError: AttributeHandler has no invokable constructor

...表明 AttributeHandler 不可调用。“可调用”是指 JavaScript 可以创建 class 的新实例TrialObject,我希望它是一个在 Python 中创建的类,并继承QObject.

如何注册一个继承QObject的元对象QJSEngine,使其可调用 IE 一个新实例可以在 JavaScript 中实例化?

(PyQt6、Python 3.9、Windows 10)


编辑 1

运行AttributeHandler.staticMetaObject.constructorCount()返回0,而对于正常情况QObject,它返回2,所以我认为问题在于构造函数实际上被元对象系统识别。Q_INVOKABLE中不存在PyQt,所以我尝试__init__用 with装饰pyqtSlot(),但这也没有预期的效果。

0 投票
1 回答
115 浏览

c++ - C++ QT 在 QJSEngine 中调用 C++ 函数

我正在尝试调用在 C++ 中实现的函数来调用 JS 函数,该函数使用 QT QJSEngine 进行评估。

到目前为止,我已经尝试过了

我的功能评估看起来像这样

在公式中,我调用了 cppFunction 并且 functionArgList 提供了参数,这些工作正常,我已经检查过了。所以,但不知何故它没有被调用,我也没有收到错误。我错过了什么还是应该以这种方式工作?

0 投票
0 回答
32 浏览

qt - 使用 QT 的 QJSEngine 时如何找到信号的“发送者”

我们正在使用 QJSEngine 为我们的 QT 应用程序提供脚本。

在 C++ QObject 派生类中,您可以访问sender()方法来访问发出信号的对象。

你如何在 qjsengine() 中运行的 JavaScript 内部做同样的事情?