Kinder des QML -Gitters löschen
-
28-10-2019 - |
Frage
Ich möchte durch die Kinder eines QML -Gitters durchgehen und jeden von ihnen mit JavaScript zerstören.
Grid {
id: contentGrid
spacing: 10
ImageItem { imageSource: "file:/foo.jpeg" } // destroy this
ImageItem { imageSource: "file:/bar.jpeg" } // destroy this as well
}
Ich habe versucht, so etwas zu tun, aber es funktioniert bisher nicht.
for(var i = 0; contentGrid.children.length() < i; i++) {
contentGrid.childAt(i).destroy();
}
Lösung
Sie haben eine Reihe von Problemen in Ihrem Versuch oben ... Erstens müssen Sie rückwärts iterer sein, weil Sie den Inhalt der Kinder nach vorne verändern würden (dh wenn Sie Nr. 1 löschen, würde Nummer 2 würden Werden Sie das Kind Nr. 1 und dann gehen Sie zu Löschen Nr. 2, was das alte Kind #3 wäre).
Zweitens müssen Sie anders auf die Kinder zugreifen. Die Funktion von Childat () dient zum Auffinden eines Kindes in einem bestimmten x, y auf dem Bildschirm, nicht in einer Position in einer Liste.
Versuchen Sie es stattdessen:
import QtQuick 1.0
Rectangle {
width: 400
height: 400
Grid {
id: contentGrid
spacing: 10
Text { text: "foo" } // destroy this
Text { text: "bar" } // destroy this as well
}
MouseArea {
anchors.fill: parent
onClicked: {
for(var i = contentGrid.children.length; i > 0 ; i--) {
console.log("destroying: " + i)
contentGrid.children[i-1].destroy()
}
}
}
}
Andere Tipps
Oder Sie können nur sagen: grid.children = "";
Ich möchte nur ein Fragment aus der Dokumentation kopieren und einfügen:
Beachten Sie, dass Sie niemals manuell manuell löschen sollten, die dynamisch durch QML -Objektfabriken für die Bequemlichkeitsstelle (wie Lader und Repeater) erstellt wurden. Sie sollten auch vermeiden, Objekte zu löschen, die Sie selbst nicht dynamisch erstellt haben.
Dann ist die Antwort, dass Sie es nicht tun sollten! Versuchen Sie, das Objekt dynamisch zu erstellen, wenn Sie es später löschen möchten.
Als Ergänzung zu Atrons Antwort beachten Sie, dass die Dokumentation erwähnt das ausdrücklich destroy
Manuelles statisch erstelltes Objekt ist nicht zulässig:
Item { SelfDestroyingRect { // ... } }
Dies würde zu einem Fehler führen, da Objekte nur dynamisch zerstört werden können, wenn sie dynamisch erstellt würden.
Daher stimme ich MShefiti zu, dass die richtige Lösung (für nicht dynamisch erstellte Elemente) lautet:
grid.children = [];