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

Posted

技术标签:

【中文标题】C++ QT 在 QJSEngine 中调用 C++ 函数【英文标题】:C++ QT Call C++ function in QJSEngine 【发布时间】:2021-08-04 10:02:44 【问题描述】:

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

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

class Person : public QObject 

Q_OBJECT

public:
    Q_INVOKABLE cppFunction(int a);
    
;

我的函数评估看起来像这样

QJSValue formulaFunction = jsEngine->evaluate("(function(" + functionArgList.join(",") + ") " + formula + ")");

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

【问题讨论】:

不确定这是否只是一个错字,但您的 Person 类需要派生自 QObject 【参考方案1】:

所以,经过一些研究,我让它运行起来了。

class MyObject : public QObject

   Q_OBJECT

public:
    Q_INVOKABLE MyObject() 
    Q_INVOKABLE bool hasChannel(int id);
;

QJSEngine engine;
    QJSValue injectedObject;
    injectedObject= engine.newQMetaObject(&MyObject::staticMetaObject);
    engine.globalObject().setProperty("MyObject", injectedObject);

所以,我在这里创建了一个继承自 QObject 的新类。 该类有两个方法,我想在QJSEngine中调用的每个方法都必须在方法声明前提供Q_INVOKABLE标签。

引擎运行的示例 JS 代码如下所示

let myObject = new MyObject();
myObject.hasChannel(1234);

我不知道注入的前缀是否合适,但我想不出更好的前缀

【讨论】:

以上是关于C++ QT 在 QJSEngine 中调用 C++ 函数的主要内容,如果未能解决你的问题,请参考以下文章

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

Qt使用QJSEngine执行脚本

如何在 QJSEngine 中注册 QList<quint64> 之类的类型?

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

Qt QJSEngine 导入js文件

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