QJSEngine 删除我的 QObject,如何在 QJSEngine::newQObject 之后更改所有权?

Posted

技术标签:

【中文标题】QJSEngine 删除我的 QObject,如何在 QJSEngine::newQObject 之后更改所有权?【英文标题】:QJSEngine deletes my QObject, how to change ownership after QJSEngine::newQObject? 【发布时间】:2014-10-03 10:55:07 【问题描述】:

尝试使用子类 QObject 作为参数执行小脚本。

QJSEngine jsEngine;
QJSValue arg = jsEngine.newQObject(child); // Child it's subclassed QObject
QJSValue function = jsEngine.evaluate(m_childRestriction);

QJSValue result = function.call(QJSValueList() << arg);

在销毁 jsEngine 时,它​​会为我的子对象调用 delete(因为 newQObject 使用 javascriptOwnership 创建它)。如何避免它,如何更改 arg 的所有权?

脚本很简单:

function(device)  
    return device.m_place >=0 && device.m_place < 16; 

统一更新: 可以为对象调用QQmlEngine::setObjectOwnership(child, QQmlEngine::CppOwnership);,因为它是静态函数。只是从帮助中不清楚。认为它也应该在QJSEngine 中。

【问题讨论】:

您可以尝试将QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership); 添加到对象的构造函数中。不确定它是否适用于您的情况,但它确实阻止了 Qml 删除我们的对象。 我没有QQmlEngine,它是继承QJSEngine的。 你仍然可以使用@RetiredNinja 提到的方法。它在同一个 Qt 模块中(所以你总是可以使用它),它甚至被 QJSEngine 内部使用!它实际上被QJSEngine 用来将对象的所有权设置为JavaScript。之后你可以像@RetiredNinja 所说的那样调用它,让它归 CPP 所有。 哦,是的,它是一个静态函数...非常感谢。 【参考方案1】:

可以调用QQmlEngine::setObjectOwnership(child, QQmlEngine::CppOwnership);对于对象,因为它是静态函数。只是从帮助中不清楚。认为它也应该在 QJSEngine 中。

【讨论】:

以上是关于QJSEngine 删除我的 QObject,如何在 QJSEngine::newQObject 之后更改所有权?的主要内容,如果未能解决你的问题,请参考以下文章

如何将枚举类型注册到 QJSEngine 以从脚本环境中使用?

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

如何清理或销毁 QJSEngine?

如何使用 QJSEngine 构建 API?

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

如何从父级中删除 QObject