问题标签 [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.
c++ - 如何将枚举类型注册到 QJSEngine 以从脚本环境中使用?
我已经搜索了几个小时,但我不知道如何从 C++ 端注册枚举类型,以便在使用 QJSEngine 时可以从脚本环境端使用它?
我有一个派生自 QObject 的类,已注册到脚本环境并具有一个将枚举作为参数的函数。我希望能够从脚本环境中调用该函数。
使用 QJSEngine 时,我需要做什么才能从脚本端调用 set()?我已经尝试将 Q_ENUM 调用注释掉,但它似乎没有帮助。
javascript - 使用 QJSEngine 对我的应用程序有安全影响吗?
我正在使用 QJSEngine 让用户脚本自定义数据在我的应用程序中进行转换。我了解 QJSEngine 没有沙盒化,并且运行在与我的应用程序相同的特权级别。这是否有我需要担心的安全隐患?我没有向 QJSEngine 公开任何应用程序对象。
我尝试了几件事:
打开网址:
读取文件:
访问注册表:
这些都不起作用。那么用户可以从 QJSEngine 内部做些什么讨厌的事情呢?如果是这样,是什么?
javascript - QJSEngine,全局和脚本,是什么导致语法错误
我正在使用QJSEngine,我向对象添加了一个全局对象:
pobjScriptEng
是一个指向 的实例的指针QJSEngine
。
我有一张全局地图,地图类型定义:
我遍历全局映射,将它们添加到引擎中:
rmpGlobals
是对全局映射的引用。
我有一个脚本,其中包含对全局的引用,全局被调用db
并且是一个 JSON 对象,其中包含:
我在调用的循环中添加了一些调试日志,setProperty
这就是应用程序输出中显示的内容:
语法错误来自 JSON,但为什么它没有任何问题。我转储result.toString()
到控制台,它包含:
SyntaxError: 预期的标记 `,'
剧本:
运行我的应用程序并评估脚本时,我在“应用程序输出”中看到以下内容:
忽略之前的所有内容,[js]
这是我的时间戳和调试信息,之后[js]
是所有控制台输出。
是什么:
SyntaxError: 预期的标记 `,'
我在全局或脚本中看不到任何错误。
如果我修改脚本并插入:
作为第一行,没有显示语法错误,一切正常,那么 global 添加 using 有什么问题setProperty
?
这是向地图添加全局的代码:
一些定义:
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?
c++ - 使用 QJsEngine 在 Qt 中注册自定义类型
我有一个名为 LObject 的自定义类,我想调用一个方法“test”。我有一个在 QJSEngine 中注册的方法,它返回一个 LObject 的实例。执行该方法时收到错误消息:
我试图用 Q_DECLARE_METATYPE 注册我的类型,但是我不能调用我的 LObject 的方法。
有什么办法呢?
编辑:一个包含 3 个文件的最小示例
服务器.h:
主.cpp:
测试.qml
qt - 我可以保留传递给 QJSEngine 的 QObject 的所有权吗?
我正在使用 QJSEngine 并绑定一些对象engine.globalObject().setProperty(name, engine.newQObject(obj));
问题是 QJSEngine 析构函数正在调用这些对象的析构函数,但我希望它们比 QJSEngine 对象更长寿。
即使我从 globalObject() 中删除该属性也会发生这种情况。
c++ - 在脚本调用的 C++ 函数中调用 QJSEngine::newQObject() 是否有效?
考虑这个例子:
ObjectCreator
通过以下方式设置为全局属性QJSEngine
:
JavaScript(engine_
从之前的代码片段中评估):
阅读文档我找不到这个问题的答案:
engine_->newQObject()
调用通过评估的 JavaScript 脚本调用的 C++ 函数是否有效engine_
?
python - 将继承的 QObject 的元对象注册到 QJSEngine
我想继承QObject
该类,并将继承类的元对象注册到一个 QJSEngine 实例,以便我可以let instance = new TrialObject();
在 JavaScript 中调用。这是我的代码:
当(如上所述),我使用QObject.staticMetaObject
as 时TrialObject
,JavaScript 运行良好,并返回QObject
给 Python。因此QObject
是可调用和工作的。但是当我尝试用 替换QObject.staticMetaObject
时AttributeHandler.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()
,但这也没有预期的效果。
c++ - C++ QT 在 QJSEngine 中调用 C++ 函数
我正在尝试调用在 C++ 中实现的函数来调用 JS 函数,该函数使用 QT QJSEngine 进行评估。
到目前为止,我已经尝试过了
我的功能评估看起来像这样
在公式中,我调用了 cppFunction 并且 functionArgList 提供了参数,这些工作正常,我已经检查过了。所以,但不知何故它没有被调用,我也没有收到错误。我错过了什么还是应该以这种方式工作?
qt - 使用 QT 的 QJSEngine 时如何找到信号的“发送者”
我们正在使用 QJSEngine 为我们的 QT 应用程序提供脚本。
在 C++ QObject 派生类中,您可以访问sender()
方法来访问发出信号的对象。
你如何在 qjsengine() 中运行的 JavaScript 内部做同样的事情?