QJSEngine和QScriptEngine有什么区别
时间: 2024-01-21 18:04:16 浏览: 63
QJSEngine 和 QScriptEngine 都是 Qt 框架中的 JavaScript 引擎,用于在 Qt 应用程序中执行 JavaScript 代码。它们之间的主要区别在于 QJSEngine 是从 Qt 5 开始引入的,而 QScriptEngine 在 Qt 4 中就已经存在了。此外,QJSEngine 更加符合 ECMAScript 标准,支持新的 JavaScript 特性,例如:箭头函数和 let/const 关键字。另外,QJSEngine 可以通过多线程运行,提高脚本解析和执行的速度。
相关问题
QJSEngine 支持TypeScript
QJSEngine 默认不支持 TypeScript。不过,你可以使用 QJSEngine 的 QJSValue 类来实现 TypeScript 和 JavaScript 的交互。
具体来说,你可以使用 ttypescript 工具将 TypeScript 源代码编译为 JavaScript,然后将编译后的 JavaScript 传递给 QJSEngine 执行。在 JavaScript 中,你可以使用 QJSEngine 的 QJSValue 类来访问 TypeScript 中定义的变量和函数。
例如,假设你有一个 TypeScript 文件 `example.ts`,其中定义了一个函数 `add`:
```typescript
function add(a: number, b: number): number {
return a + b;
}
```
你可以使用 ttypescript 工具将其编译为 JavaScript:
```bash
$ tsc example.ts
```
然后在 C++ 中,你可以使用 QJSEngine 执行 JavaScript 代码:
```cpp
#include <QJSEngine>
#include <QJSValue>
int main() {
QJSEngine engine;
// 读取编译后的 JavaScript 代码
QFile file("example.js");
file.open(QIODevice::ReadOnly | QIODevice::Text);
QByteArray code = file.readAll();
file.close();
// 执行 JavaScript 代码
QJSValue result = engine.evaluate(QString::fromUtf8(code));
// 调用 TypeScript 中定义的函数
int a = 1, b = 2;
QJSValue add = result.property("add");
QJSValueList args;
args << a << b;
int sum = add.call(args).toInt();
return 0;
}
```
需要注意的是,TypeScript 中的类型信息在编译后会被擦除,因此在 JavaScript 中访问 TypeScript 变量时需要进行类型检查。
QJSEngine引入插件
QJSEngine 是一个用于在 Qt 应用程序中嵌入 JavaScript 的类。如果您想要引入插件,您需要编写一个 C++ 插件并将其注册给 QJSEngine,使其可供 JavaScript 代码调用。
以下是一个简单的示例,展示如何创建一个名为 "MyPlugin" 的插件,并在其中添加一个名为 "hello" 的函数:
```cpp
#include <QJSValue>
#include <QJSEngine>
#include <QObject>
class MyPlugin : public QObject
{
Q_OBJECT
public:
Q_INVOKABLE QString hello(const QString &name) {
return QString("Hello, %1!").arg(name);
}
};
int main()
{
QJSEngine engine;
MyPlugin plugin;
engine.globalObject().setProperty("myPlugin", engine.newQObject(&plugin));
engine.evaluate("print(myPlugin.hello('world'))");
return 0;
}
```
在此示例中,我们首先创建了一个名为 "MyPlugin" 的类,并在其中添加了一个名为 "hello" 的函数。接下来,我们创建了一个 QJSEngine 实例,并实例化了 MyPlugin 类。然后,我们将 MyPlugin 对象注册到 QJSEngine 的全局对象中,并将其命名为 "myPlugin"。最后,我们使用 evaluate() 函数执行了一个简单的 JavaScript 代码,该代码调用了 "myPlugin" 对象的 "hello" 函数并打印了其返回值。
请注意,使用 Q_INVOKABLE 宏可以将 C++ 函数声明为可从 JavaScript 代码中调用的函数。此外,可以使用 Q_PROPERTY 宏将 C++ 属性公开给 JavaScript 代码。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)