2012-01-13 3 views
8

Voglio passare in rassegna i figli di una griglia di QML e distruggerli utilizzando Javascript.Elimina figli di QML Grid

Grid { 
    id: contentGrid 
    spacing: 10 

    ImageItem { imageSource: "file:/foo.jpeg" } // destroy this 
    ImageItem { imageSource: "file:/bar.jpeg" } // destroy this as well 
} 

Ho provato a fare qualcosa di simile ma non funziona fino ad ora.

for(var i = 0; contentGrid.children.length() < i; i++) { 
    contentGrid.childAt(i).destroy(); 
} 

risposta

11

Si dispone di un certo numero di problemi nel vostro tentativo sopra ... In primo luogo, avrete bisogno di iterare indietro perché si sarebbe spostando il contenuto dei bambini verso il basso, come si avanza (ad esempio, se si elimina N. 1, il numero n. 2 diventerebbe figlio n. 1 e quindi andresti a eliminare n. 2, che sarebbe il vecchio n. 3).

In secondo luogo, è necessario accedere ai bambini in modo diverso. La funzione childAt() serve per localizzare un bambino in una particolare x, y sullo schermo, non in una posizione in una lista.

Prova a modificare:

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() 
     } 
    } 
    } 
} 
+0

Wooop. Eccezionale. – alex

+15

Ah ah! la parte migliore è che dovevo tornare a trovare la mia risposta per ricordare come fare questo! –

+0

nel contesto di retrocessione: se distrugge i titolari dei rifiuti, la raccolta dei bambini, perché no mentre (grid.children.length> 0) grid.children [0] .destroy()? – quetzalcoatl

3

o si può solo dire: grid.children = "";

+0

Funziona davvero, mi chiedo come si comporta in termini di prestazioni/consumo di memoria, rispetto alla soluzione molto più complicata nell'altra risposta (http://stackoverflow.com/a/8852535/1202500) – mozzbozz

+0

@mozzbozz c'è nessun ciclo, quindi direi che si comporta meglio. Ma ancora non ho molta familiarità con le misurazioni delle prestazioni. – mshefiti

+2

Il mio test mostra che i bambini non vengono distrutti e rimangono in memoria. –

4

voglio solo copiare & incollare un frammento di documentazione:

Nota che non bisogna mai manualmente eliminare oggetti creati dinamicamente da convenienti fabbriche di oggetti QML (come Loader e Repeater). Inoltre, evitare di eliminare oggetti che non sono stati creati dinamicamente da soli.

Quindi, la risposta è CHE NON DEVI farlo! Prova a creare l'oggetto in modo dinamico se desideri eliminarlo in un secondo momento.

Documentation

+1

La documentazione dice davvero questo. http://doc.qt.io/qt-4.8/qdeclarativedynamicobjects.html dice anche "Si noti che se un'istanza SelfDestroyingRect è stata creata staticamente in questo modo: ' Item {SelfDestroyingRect {// ...}} 'Ciò risulterebbe in un errore, dal momento che gli oggetti possono essere distrutti dinamicamente solo se sono stati creati dinamicamente. " –

0

In aggiunta alla risposta di Atron, notare che il documentation menziona esplicitamente che destroy ing un oggetto creato in modo statico manualmente non è consentito:

Item { 
    SelfDestroyingRect { 
     // ... 
    } 
} 

Questo si tradurrebbe in un errore, poiché gli oggetti possono essere dinamicamente modificati solo se sono stati creati dinamicamente.

Pertanto, sono d'accordo con mshefiti che la soluzione corretta (per gli articoli che non vengono creati dinamicamente) è:

grid.children = [];