问题标签 [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 回答
255 浏览

javascript - QJSEngine 不会正确评估 js 数组

我有一个文件settings.js,其中包含一个带有设置数组的数组:

如您所见,该文件仅包含数组值,没有分配给变量,最后没有分号。

放在settings.js里面:resources.qrc

我读了settings.jswith QFile。以下是评估 javascript 的代码:

由于该Output行,我知道文件已正确读取,但QJSEngine不会正确评估该值。因为settingsArrayJSValue.isArray()评估为,所以我调用了所有is...()函数settingsArrayJSValue。仅settingsArrayJSValue.isUndefined()评估为true

我也试过这个:

然后settingsArrayJSValue.isObject()评估为(在谈到 js 世界时,这是一种预期的方式),但我也得到一个SyntaxError: Expected token 'numeric literal'

我的最终目标是解析设置数组。因此,我想JSON.stringify评估数组并使用 QtQJson类:

为什么 QJSEngine 将有效数组评估为undefined

如何让 QJSEngine 正确评估数组以便我可以进一步处理它?

0 投票
1 回答
535 浏览

c++ - Qt 5.11.2(Clang 8.0 (Apple),64 位),未找到 QJSEngine 文件

我正在从以前使用 Qt 5.6 构建的项目中移植源代码,现在我正在更新到 5.11

尝试构建项目时出现错误:

在我的消息来源中:

在我使用的函数中:

Qt Creator 关于信息:

关于我的 iMac:

我也在以前的 Qt Creator 版本上尝试过,结果相同。

这是专业文件:

0 投票
2 回答
124 浏览

c++ - QJSEngine 全局字符串比较

我使用的是 Qt 5.11.2,在我的应用程序中我使用的是 QJSEngine,在我的示例中我有一个脚本:

我已将此脚本连接到应用程序中的一个按钮,当我单击该按钮时,脚本会调用 connect() 函数。我已经注册了一些用于脚本的全局变量:

单击按钮时脚本应用程序的输出为:

我从来没有看到“第一次扫描”并且变量的类型仍然是字符串,因为它没有进入 eval 语句。

为什么比较不起作用?我尝试了多种选择:

这些都不是更好,为什么比较不起作用?

[编辑] 我已将脚本修改为:

使用这样的脚本,我在输出中得到以下内容:

但是,如果我向 if 条件添加任何比较,将字符串与“true”进行比较,如果没有传递到第一个扫描条件。

[Edit2] 我将创建全局变量“strFirstScan”的代码修改为:

这现在解决了问题和我的脚本:

作品。

0 投票
1 回答
156 浏览

qt - 如何从 Qt 5.12 中的 QJSEngine 获取标准输出?

ConsoleExtension通过调用启用调试脚本installExtensions。如何捕获 QJSEngine 的控制台输出?

0 投票
2 回答
419 浏览

c++ - 如何清理或销毁 QJSEngine?

我正在使用 Qt 5.12 组合一个应用程序,用户将在其中加载通过其 API 与应用程序交互的 JS 脚本。这些脚本被捆绑到“项目”中(即多个相互依赖的JS模块),并且任何时候我都希望只有一个项目加载到JS引擎中,所以如果用户加载不同的项目,我想要前一个要清理的上下文。

根据文档,我假设如果我只是删除 QJSEngine 对象并创建一个新对象,这将允许我创建一个新的 JS 上下文。

当我尝试运行此代码时,我在delete jsEngine. 这真的很奇怪,因为文档本身就说明了

QJSEngine 销毁期间不会从持久 JS 堆中收集垃圾。如果您需要释放所有内存,请在销毁 QJSEngine 之前手动调用 collectGarbage。

这对我来说意味着我应该能够做到这一点。有人有想法么?提前致谢!

0 投票
1 回答
195 浏览

qt - 单个应用程序中有多个 QJSEngine 实例?

单个 C++/Qt5 应用程序拥有多个独立的 JavaScript 引擎实例是否正常?在我的应用程序中,我有几个 QObject 继承的对象,它们充当独立的数据处理单元。在它们中的每一个中,我都希望能够启动 JS 脚本,并且我希望这些脚本的上下文在这些单元之间是独立的。最简单的想法是让每个单元都有自己的 QJSEngine 实例。一个简单的测试表明,如果我在同一个应用程序中创建两个引擎并在其中一个中设置自定义全局属性,则第二个引擎不知道该属性,这正是我想要的。但是仍然不明显的是,没有一些全局状态属性对所有 QJSEngine 实例都是通用的。官方 Qt 文档中似乎从未提及多实例的问题。

0 投票
0 回答
147 浏览

c++ - 随着 QScriptEngine 的弃用,我们如何移植 QScriptClass 相关的代码?

QScriptEngine 已弃用,移植相关代码涉及使用 QJSEngine 或派生类 QQmlEngine。这些类仅适用于 QObject 派生类。在 QScriptEngine 世界中,可以使用从 QScriptClass 派生的包装类将非 QObject 派生类作为可实例化的 JavaScript 对象提供。但是 QScriptClass 在构建时需要一个 QScriptEngine,所以 QScriptEngine 世界和 QJSEngine 世界之间存在不兼容。如何围绕非 QObject 派生类(或结构,例如)编写包装器?

0 投票
0 回答
79 浏览

c++ - 如何将不属于 QObject 的枚举暴露给 QJSEngine?

我正在为我的 SW 编写脚本包装器,因此我可以通过脚本控制我的 SW。包装类的目的是将脚本接口与实际类分开,因为我可能不想公开类的所有信号和槽。我正在使用 Qt 5.13 和 QJSEngine。

我的问题是,根据我所阅读的内容和我所做的实验,似乎要能够公开一个枚举,它需要在一个继承 QObject 并通过 newQObject()/setProperty() 公开的类中。但是,我不想在下面的示例中公开类 Foo,但我仍然想将枚举 Foo::Bar 公开给脚本环境。我该怎么做呢?Q_ENUM 似乎假设枚举在 QObject 内,并且 QObject 在脚本环境中公开(属性)。这是我正在做的一个简短示例(我希望能够从脚本环境调用 FooWrapper::slot1() ):

0 投票
1 回答
349 浏览

qt - 如何注册像 QList 这样的类型在 QJSEngine 中?

我在我的 Qt 应用程序中使用 QJSEngine 编写脚本。我的 C++ 函数之一返回QList<quint64>类型,我需要从 javascript 调用它。调用它没有错误。但是,它返回QVariant(QList<qulonglong>)而不是预期的整数列表。另一个定义为QList<int>在 C++ 中返回的函数在 javascript 中可以正常工作,返回整数列表。我浏览了 and 的文档QJSEngineQJSValue并没有找到解决此问题的提示。PSquint64本身也可以正常工作-只是它们的列表不起作用。

0 投票
0 回答
68 浏览

javascript - javascript callstack,队列如何在promise中处理http请求

我正在了解 js 引擎如何处理承诺,然后我得到了这篇很棒的文章https://medium.com/@jitubutwal144/javascript-how-is-callback-execution-strategy-for-promises-different-than-dom-events-回调 73c0e9e203b1. 这让我非常清楚。但是,如果我们在 Promise 中发出 HTTP 请求,那么当 js 看到包含 Http 请求的 Promise 对象时,它会将其回调添加到微任务队列中,并且 js 调用堆栈开始执行 Promise。它看到 HTTP 请求并将其发送到浏览器以进行处理。现在浏览器完成了它并将http回调添加到调用resolve,request的任务队列中。根据它的 js 引擎首先选择微任务,但它不能对微任务做任何事情,因为它的结果回调在任务队列中。我对 js 引擎将如何处理它感到困惑。谁能帮忙