2012-01-13 26 views
8

Chcę przełączyć się przez dzieci sieci QML i zniszczyć każdą z nich za pomocą Javascript.Usuń dzieci z QML Grid

Grid { 
    id: contentGrid 
    spacing: 10 

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

Próbowałem zrobić coś takiego, ale to nie działa tak daleko.

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

Odpowiedz

11

mieć szereg problemów w swojej próbie powyżej ... Po pierwsze, musisz iteracyjne tyłu bo chcesz być przesuwanie zawartości dzieci w dół, jak wcześniej (czyli jeśli usuniesz # 1, numer # 2 stałby się dzieckiem nr 1, a następnie chciałbyś usunąć # 2, które byłoby starszym dzieckiem # 3).

Po drugie, musisz inaczej uzyskać dostęp do dzieci. Funkcja childAt() służy do lokalizowania dziecka na określonym x, y na ekranie, a nie pozycji na liście.

Spróbuj to zamiast:

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. Niesamowite. – alex

+15

Ha ha! najlepsze jest to, że musiałem wrócić, aby znaleźć własną odpowiedź, aby pamiętać, jak to zrobić! –

+0

w kontekście wstecznym: jeśli niszcząc renumeruje kolekcję dzieci, dlaczego nie podczas (grid.children.length> 0) grid.children [0] .destroy()? – quetzalcoatl

3

lub można po prostu powiedzieć: grid.children = "";

+0

To faktycznie działa, po prostu zastanawiam się, jak to zachowuje się w wydajności/zużyciu pamięci, w porównaniu do znacznie bardziej skomplikowanego rozwiązania w innej odpowiedzi (http://stackoverflow.com/a/8852535/1202500) – mozzbozz

+0

@mozzbozz tam jest bez pętli, więc przypuszczam, że zachowuje się lepiej. Ale nadal nie jestem bardzo zaznajomiony z pomiarami wydajności. – mshefiti

+2

Mój test pokazuje, że dzieci nie są niszczone i pozostają w pamięci. –

4

Chcę po prostu skopiować & wkleić fragment z dokumentacji:

Należy pamiętać, że nigdy nie należy ręcznie usuń obiekty, które zostały dynamicznie utworzone przez dogodne fabryki obiektów QML (takie jak Loader i Repeater). Należy także unikać usuwania obiektów, które nie zostały samodzielnie utworzone przez użytkownika dynamicznie.

Następnie odpowiedź brzmi: NIE POWINIENEŚ robić tego! Spróbuj utworzyć obiekt dynamicznie, jeśli chcesz go później usunąć.

Documentation

+1

Dokumentacja rzeczywiście tak mówi. http://doc.qt.io/qt-4.8/qdeclarativedynamicobjects.html mówi również "Zauważ, że jeśli instancja SelfDestroyingRect została utworzona statycznie w następujący sposób: ' Item {SelfDestroyingRect {// ...}} 'To spowodowałoby w przypadku błędu, ponieważ elementy mogą być dynamicznie niszczone, jeśli zostały utworzone dynamicznie. " –

0

Jako dodatek do odpowiedzi Atron jest pamiętać, że documentation wyraźnie wspomina, że ​​destroy ing statycznie utworzony obiekt ręcznie nie jest dozwolony:

Item { 
    SelfDestroyingRect { 
     // ... 
    } 
} 

Spowodowałoby błędu ponieważ obiekty mogą być dynamicznie niszczone tylko wtedy, gdy zostały utworzone dynamicznie.

Dlatego zgadzam się z mshefiti że prawidłowe rozwiązanie (dla elementów, które nie są tworzone dynamicznie) jest:

grid.children = [];