【问题标题】:QJSEngine deletes my QObject, how to change ownership after QJSEngine::newQObject?QJSEngine 删除我的 QObject,如何在 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 所有。
  • 哦,是的,它是一个静态函数...非常感谢。

标签: c++ qt qjsengine


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多