2016-08-21 3 views
2

Ich habe eine Anwendung, die StackView verwendet und viele dynamisch erstellte Objekte in dieses StackView verschiebt und ich brauche eine Möglichkeit, dieses Objekt zu zerstören, wenn sie aus StackView herausgefallen sind. Wenn ich Steuerelemente verwenden 1 Stackview, kann ich nur Push-Objekt mit destroyOnPop Eigenschaft (wie es in this question gezeigt wurde):QtQuick.Controls 2 StackView und destroyOnPop

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

aber es funktioniert nicht für Steuerungen 2 StackView. Was ist die richtige Lösung für dieses Problem?

Ich kenne nur einen Weg: Rufen Sie object.destroy() mit Verzögerung, wenn ich es pop, aber diese Art sieht aus wie Kludge. Wenn es wichtig ist, kann ich dynamisch generierten Objekten beliebigen Code hinzufügen

Antwort

3

Controls 2 StackView hat Semantik der Eigentumsrechte vereinfacht. übernimmt Besitz von jedem Element, das es dynamisch instanziiert hat. Wenn Sie die Instanz erstellt haben, haben Sie die Kontrolle über die Instanz. Mit anderen Worten, wenn Sie wollen zu zerstören, drücken Sie Component s oder URLs und lassen Sie die Instanzen erstellen.

Wenn Sie die erstellte Instanz zugreifen müssen, können Sie einfach den Rückgabewert Griff:

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

Es arbeitet mit Qt.createComponent aus der Datei, danke, aber ich verstehe nicht, wie ich den Code ändern sollte, wenn Ich verwende Qt.createQmlObject? Mein Testcode ist hier https://gist.github.com/anonymous/372c58e7f53531bd6e51950d611e33a7 – aknew

+0

Aus Neugier, was ist der Hauptgrund für die Verwendung von 'Qt.createQmlObject()'? Es ist ein netter Trick, um harte Abhängigkeiten etc. zu vermeiden, aber in den meisten Fällen scheinen explizite Komponenten besser zu sein. Wie auch immer, mit QtQuick Controls 2.1 in Qt 5.8 können Sie folgendes tun: 'Rectangle {StackView.onDeactivated: destroy()}'. Mit 2.0 wirst du vermutlich auf die Überprüfung des Status zurückgreifen müssen: 'Rectangle {StackView.onStatusChanged: if (StackView.status === StackView.Inactive) destroy()}' – jpnurmi

+0

Es funktioniert, danke. Der Grund für die Verwendung von createQmlObject ist sehr einfach: Ich dynamische Ansichten für Tabellen aus wenigen SQLite-Basen und ich weiß nicht, welche Felder Tabellen in der Laufzeit enthalten. Historisch habe ich am Anfang häufig die struct-Struktur geändert und es war nur ein Weg, nicht zu vergessen, etwas qml zu ändern. Wenn Sie sich für meinen Code interessieren, hier ist mein GitHub https://github.com/aknew/CoinsVariationBase – aknew

Verwandte Themen