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

Posted

技术标签:

【中文标题】在脚本调用的 C++ 函数中调用 QJSEngine::newQObject() 是不是有效?【英文标题】:Is it valid to call QJSEngine::newQObject() in a C++ function called by a script?在脚本调用的 C++ 函数中调用 QJSEngine::newQObject() 是否有效? 【发布时间】:2020-07-28 19:44:19 【问题描述】:

考虑这个例子:

ObjectCreator 通过QJSEngine 设置为全局属性:

// ObjectCreator is exposed to engine_ env as global property
class ObjectCreator : public QObject

    Q_OBJECT

public:
    ObjectCreator(QJSEngine * engine, QObject * parent = nullptr) : QObject(parent), engine_(engine) 
    
    // Called from script env
    Q_INVOKABLE QJSValue createObject();

private:
    
    // engine_ is not owned
    QJSEngine * engine_ = nullptr;
;

class SomeObj : public QObject

    // ...
;

QJSValue ObjectCreator::createObject()

    // No parent due to javascriptOwnership
    return engine_->newQObject(new SomeObj());

JavaScript(在 engine_ 中从之前的 sn-p 评估):

function f

        // objectCreator is a global property of engine_
        const someObj = objectCreator.createObj();

阅读documentation我找不到这个问题的答案:

在通过 engine_ 评估的 JavaScript 脚本调用的 C++ 函数中调用 engine_->newQObject() 是否有效?

【问题讨论】:

【参考方案1】:

是的,当从脚本调用时,C++ 调用 QJSEngine::newQObject() 完全没问题。

您可能遇到的问题是 QJSEngine 的版本 ECMAScript 5 不支持 const(请参阅 QTBUG-69408 的说明)。将其替换为var,它应该可以工作(尽管显然它不是一个常数)。

【讨论】:

感谢您抽出宝贵时间!您介意将我指向文档中的相应部分或涵盖此内容的源代码(如果有的话)吗? 我真的不明白你的疑问QJSEngine::newQObject() 是一种 C++ 方法,因此可以被任何 C++ 代码调用。此外,如果 C++ 代码暴露给脚本(例如通过 Q_INVOKABLE),它仍然是 C++ 代码,因此调用 newQObject() 是完全有效的,不会有特定的文档告诉您可以创建 C++来自 Javascript 调用的对象,因为它遵循上面列出的基本前提。请注意,您甚至可以从另一个脚本对象(例如,engine_2)调用engine_->newQObject() 基本上会发生调用QJSEngine 实例的函数,而该实例的另一个函数调用尚未返回。我们担心这可能会触发未定义的行为。

以上是关于在脚本调用的 C++ 函数中调用 QJSEngine::newQObject() 是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章

从运行在 Web 浏览器控件中的 JavaScript 脚本调用 C++ 函数

从 C++ 调用 Python

lua 与 c++或者c 交互的底层原理谁能解释一下?最最底层的,为啥它们调用C或者C++的函数?

Python 脚本在到达 CV2 函数时卡住了

如何在 C++ 中调用大型 python 脚本?

使用 Python.h 从 C++ 调用 Django