2017-10-09 42 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的父... –