2016-08-21 11 views
2

私はStackViewを使用し、このStackViewに多くの動的作成オブジェクトをプッシュし、StackViewからポップされるときにこのオブジェクトを破棄する方法が必要です。私はコントロール1 Stackviewを使用している場合、私はちょうどdestroyOnPopプロパティを持つオブジェクト(それはthis questionに示されたように)プッシュすることができます:QtQuick.Controls 2 StackView and destroyOnPop

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

を、それはコントロール2 StackViewには適用しません。この問題の正しい解決策は何ですか?

私はただ一つの方法しか知っていません:私はそれをポップするときに遅延オブジェクトdestroy()を呼び出しますが、この方法はkludgeのように見えます。重要な場合は、動的生成オブジェクトに任意のコードを追加できます。

答えて

3

コントロール2 StackViewは単純化された所有権セマンティクスを持っています。 StackViewは、動的にインスタンス化したアイテムの所有権を取得します。インスタンスを作成していれば、そのインスタンスを制御できます。つまり、StackViewを破壊する場合は、Componentまたは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ベースから動的に作成しますが、実行時にどのフィールドにテーブルが含まれるかわかりません。歴史的に私はしばしば最初にテーブル構造体を変更しました。それはいくつかのqmlの変更を忘れないようにする方法でした。あなたが私のコードに興味があれば、ここに私のgithub https://github.com/aknew/CoinsVariationBase – aknew