2017-10-09 117 views
0

我有一个QObject子类(具有QML注册)称为ToReturn和QML单,在C++定义的,称为MySingleton。后者提供这样的功能:QObject的生命周期如何从C++返回到QML?

Q_INVOKABLE ToReturn* get_toReturn() { 
    return new ToReturn(); 
} 

当我打电话get_toReturn从QML,我是负责稍后再打destroy()方法返回的对象呢?或者有没有办法使用自动内存管理呢?

注意,我ToReturn对象逻辑上并不属于一个对象树,所以我通过nullptr的父类的构造(QObject中的)。

回答

1

它应该自动工作,并且应该对象尽快,因为它们超出了范围,没有父母,对他们没有引用存在删除。

话虽这么说,有两个注意事项:

  • 物体很少被人只要满足上述条件被破坏。他们往往徘徊了好一阵子,除非垃圾收集被迫

  • 在更复杂的情况,对象将会被删除,即使他们有父母的,对它们的引用。这是一个critical bug,现在已经有近2年的历史了,不幸的是它没有完成任何工作。这迫使我使用手动对象生命周期管理,设定所有权CPP明确只是让对象没有失踪,它只是崩溃的应用程序

默认情况下,对象从函数返回将有QQmlEngine::JavaScriptOwnership除非你显式设置,否则通过:

QQmlEngine::setObjectOwnership(objectptr, QQmlEngine::CppOwnership); 

编辑:请注意,过早缺失与JS所有权做的,所以被声明并创建了完全QML对象也受它。您也可以设置此对象的CPP所有权来保护它们,并且只能从C++中删除这些对象,最好使用deleteLater()

+0

谢谢,我发现说的一样,你的文档。但我不能找到定义返回'QQmlListProperty '(我的意思是它包含的项目,)的所有权的任何地方。我想我可以让QQmlListProperty成为ToReturns的父... –