在脚本调用的 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++ 函数