2016-08-21 88 views
2

我有應用程序使用StackView並將大量動態創建的對象推入此StackView,並且我需要某種方式從StackView彈出時銷燬此對象。如果我使用的控件1 Stackview,我只能推的對象與destroyOnPop屬性(就像是在this question所示):QtQuick.Controls 2 StackView and destroyOnPop

tablesStack.push({item: view, destroyOnPop: true}) 

但它並不適用於控制2 StackView。這個問題的正確解決方案是什麼?

我只知道一種方式:當我彈出時調用object.destroy(),但這種方式看起來像kludge。如果它很重要,我可以將任何代碼添加到動態生成的對象中。

回答

3

控件2 StackView具有簡化的所有權語義。 StackView取得它動態實例化的任何項目的所有權。如果您創建了實例,那麼您將控制實例。換句話說,如果您想要StackView銷燬,請按Component s或URL並讓StackView創建實例。

如果您需要訪問創建的實例,你可以簡單地處理返回值:

var view = stackView.push(component, {"foo": 1, "bar": 2}) 
view.doSomething() 
+0

它與Qt.createComponent從文件,謝謝,但我不知道我應該怎麼改變我的代碼時我使用Qt.createQmlObject?我的測試代碼在這裏https://gist.github.com/anonymous/372c58e7f53531bd6e51950d611e33a7 – aknew

+0

出於好奇,使用'Qt.createQmlObject()'的主要原因是什麼?避免硬依賴等是一個很好的竅門,但在大多數情況下,更明確的組件看起來更好。無論如何,使用Qt 5.8中的QtQuick Controls 2.1,你可以這樣做:'Rectangle {StackView.onDeactivated:destroy()}'。與2.0你大概不得不求助於檢查狀態:'Rectangle {StackView.onStatusChanged:if(StackView.status === StackView.Inactive)destroy()}' – jpnurmi

+0

它的工作原理,謝謝。使用createQmlObject的原因非常簡單:我動態創建來自少數sqlite基礎的視圖,並且我不知道在運行時哪些字段將包含表。 Historicaly我經常在開始時更改表結構,這只是不忘記改變一些qml的方法。如果你對我的代碼感興趣,這裏是我的github https://github.com/aknew/CoinsVariationBase – aknew