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

javascript - Qt QJSEngine 导入js文件

是否可以在 QJSEngine (QT 5.6) 中导入 javascript 文件?

示例 1:

纯文本编辑中的文本:

C++:

jsimport.js 文件中的文本:

结果:

示例 2:

纯文本编辑中的文本:

相同的 C++ 代码

结果:

由于最后一个错误,似乎有一些导入功能。

0 投票
0 回答
509 浏览

c++ - 从 QScriptEngine 迁移到 QJSEngine

我正在将 QScriptEngine 代码迁移到 QJSEngine。我现在有:

所以,用户可以把 PrintLog("what ever"); 例如,在我的应用程序中, QLineEdit 和函数 pars::PrintMainLog 将进行评估。

QJSEngine有什么方法可以做到这一点吗?那么,用户是否放置了相同的 PrintLog("what ever");?我找到的唯一方法是在这里,所以用户应该输入类似 Logger.PrintLog("what ever"); 其中 Logger 是从 QObject 继承的具有 PrintLog 插槽的类。

0 投票
1 回答
882 浏览

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

我正在使用 aQJSEngine使应用程序可编写脚本。我希望 JavaScript 端能够修改用户界面。我现在的主要问题是从 JavaScript 访问 Qt API。

为了创建小部件,我添加了一个createWidget()包装器,它使用QUILoader

我还注册了来自 的所有枚举qt_getQtMetaObject(),这似乎处理了来自 的所有命名空间级枚举qnamespace.h。不过,它看起来不像是公共 API 的一部分。

我真的应该手动处理这些东西还是我错过了什么?是不是有一个registerAllTheThings()函数可以创建一个全局Qt对象,通过它可以使用 Qt API?

如果没有,那我就有问题了。我可以QWidget用 a 创建 s QUILoader,但我找不到创建其他对象的方法,例如 a QStandardItemModel。我认为所有 Qt 类都已经通过 注册qRegisterMetaType(),但它们不是:QMetaType::type("QStandardItemModel")通过返回失败UnknownType。同样,我是否缺少一些注册所有内容的初始化函数调用?

0 投票
1 回答
1092 浏览

javascript - 使用 QJSEngine 在 Qt 中执行 Javascript 的速度

背景: 我在一个需要以下内容的项目中工作:用户可以编写命令来使用主程序的内部变量(用 Qt/C++ 编写的 GUI)执行一些数学运算。

我的方法是一个文本框,用户可以在其中用 JavaScript 编写命令/脚本,然后 Qt 评估该代码。为此,我正在使用QJSEngine

问题:JavaScript 的计算速度很差/很慢。

例如,我们只有一个带有两个文本框(QTextEdit)和一个按钮的 GUI。在一个文本框中,用户编写 JavaScript 代码,当按下按钮时,它被评估,结果出现在另一个文本框中。

作为性能不佳的一个例子,当用户编写这个微不足道的 JavaScript 代码时,计算机会花费大约 3 秒来显示答案:

另一方面,如果在 Qt/C++ 中执行相同的操作,它是“瞬时的”:

我知道 JavaScript 是一种解释型语言,但这种表现正常吗?

这里有一个小的 Qt 示例程序 (pr_Parser) 来显示这个问题。我已经在 Qt Creator 4.0.1 中对此进行了测试。使用 Qt 5.7 MSVC2013 64 位。

谢谢你。

pr_parser.pro

主文件

CMainWindow.h

CMainWindow.cpp

0 投票
0 回答
446 浏览

javascript - 如何创建 Error 类型的 QJSValue 对象 - 从 QJSEngine 抛出错误

在 Qt 中,有谁知道如何创建 Error 类型的QJSValue

上下文:我使用QJSEngine::evaluate()执行用户在使用 QT 创建的 GUI 中编写的 JavaScript 代码。该 JavaScript 代码调用 C++ 函数。根据文档,QJSEngine::evaluate() 仅在 JavaScript 代码中有错误时才会引发脚本异常(错误类型的 QJSValue)。因此,如果 C++ 函数中有错误,我的方法是返回类型错误的 QJSValue。我遵循这条路径,因为 QJSEngine::evaluate 没有捕获 C++ 异常。

这是预期功能的代码片段:

myCppClass::foo() 的迷你示例

太感谢了。

0 投票
0 回答
728 浏览

c++ - 从 QtScript 过渡到 QML/QJSEngine

有一些平台使用 QtScript 作为 JavaScript 解释器来描述应用程序的逻辑。

JS上的脚本示例

文件对象被描述为

而这样的对象超过10个,它被描述在一个平台上,很多逻辑都放在它们的构造函数/析构函数中,还有在JS代码中调用的Q_INVOKABLE方法。

问题:是否可以将所有这些转移到保存了 JS 代码语法的 QJSEngine(它已经写了很多)?

寻找对stackoverflow的响应

QJSEngine中的动态c++对象

建议通过工厂来做,但它会大大降低 JS 代码的可读性,应该重写

0 投票
0 回答
403 浏览

javascript - 如何使用 QJSEngine 在 js 脚本中访问 QObject 的子对象?

官方 qt doc中,它说:

信号和槽、对象的属性和子对象可用作创建的 QJSValue 的属性。

所以我希望访问 QObject 的孩子,但我没有找到正确的方法。

我有如下代码:

调试输出如下所示,但我在此输出中找不到子标签信息(例如文本“Hello World”)。所以,我的问题是如何在 js 脚本中访问 QLabel (objectName: "myLabel")?

0 投票
2 回答
1315 浏览

javascript - 将 QJsonObject 转换为 Javascript 对象

作为 qt 文档QJSValueQJsonObject不能隐式转换为QJSValue,我想QJSEngine从 C++ 调用一个 javascript 函数,应将参数传递QList<QJsValue>给调用另一个QJSValue包含函数本身的函数。

问题是我的一个论点是QJsonObject,直到现在我应该将其转换为文本,然后调用并将其传递给调用它以JSON.parse将其转换为对象的 javascript 函数,我正在寻找一种可以让我转换QJsonObjectQJSValueC++的解决方案并使用对象参数而不是 json 文本调用 javascript 函数。

目前代码如下所示

我想要一个像这样的功能QJSValue ConvertToQJSValue(QJsonObject object)

0 投票
1 回答
453 浏览

javascript - 我可以更改 javascript: hasFocus() 的文档方法以始终返回“true”吗?

我试图愚弄这个特定的代码:

因此,即使我不是 Chrome 中的前台应用程序,它也会返回 True。我想到的解决方案:

  1. 以某种方式使用硒?

  2. 在 chrome JS 引擎或 chromium 中编译新的 hasFocus() 方法?总是返回 True。

0 投票
0 回答
296 浏览

c++ - QJSEngine 在访问指向 C++ 对象的指针时导致退出时崩溃

我正在尝试使我的应用程序的一部分可编写脚本。我有一个对象“GraphLogic”,其中包含一个关于“块”对象的指针表。我想在我的脚本中访问这个对象。

实现(graphlogic.cpp):

我也使Block::GetLabel()方法可编写脚本。这是类block.h:

和block.cpp:

我可以使我的“GraphLogic”对象可用于脚本,它工作正常。当我尝试访问块对象时,我可以获得块标签,脚本到最后并正常退出。

Macro.qs(作为参数传递给GraphLogic::export):

但是当我再次尝试访问Block对象时,它会崩溃。这是示例main.cpp

}

可能是因为它们已经被 QJSEngine 销毁了?我说这是因为当我忘记明确声明GraphLogic对象的所有权为QQmlEngine::CppOwnership时,发生了同样的问题。

所以,我想我必须找到一种方法来防止 QJSEngine 破坏Block对象。与QQmlEngine::setObjectOwnership相同,但在 javascript 中,因为我无法访问脚本之外的当前块。关于如何实现这一目标的任何想法?谢谢,