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();
}
War es hilfreich?

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.

Dokumentation

Als Ergänzung zu Atrons Antwort beachten Sie, dass die Dokumentation erwähnt das ausdrücklich destroyManuelles 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 = [];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top