【发布时间】: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 所有。 -
哦,是的,它是一个静态函数...非常感谢。