我想循环遍历QML Grid的子节点并使用Javascript销毁它们。
Grid {
id: contentGrid
spacing: 10
ImageItem { imageSource: "file:/foo.jpeg" } // destroy this
ImageItem { imageSource: "file:/bar.jpeg" } // destroy this as well
}
我试图做这样的事情,但到目前为止还不行。
for(var i = 0; contentGrid.children.length() < i; i++) {
contentGrid.childAt(i).destroy();
}
答案 0 :(得分:13)
你在上面的尝试中遇到了许多问题......首先,你需要向后迭代,因为你要在你前进时将孩子的内容转移(即,如果你删除#1,数字#2将成为孩子#1,然后你将删除#2,这将是老孩子#3)。
其次,您需要以不同方式访问孩子。 childAt()函数用于在屏幕上的特定x,y处定位子项,而不是列表中的位置。
请改为尝试:
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()
}
}
}
}
答案 1 :(得分:3)
或者你可以说:grid.children = "";
答案 2 :(得分:3)
我只想复制&amp;粘贴文档中的片段:
请注意,绝不应手动删除由便捷QML对象工厂(例如Loader和Repeater)动态创建的对象。 此外,您应该避免删除自己未动态创建的对象。
然后,答案是你不应该这样做!如果您想稍后删除它,请尝试动态创建对象。
答案 3 :(得分:0)
作为Atron答案的补充,请注意documentation明确提到不允许手动destroy
静态创建的对象:
Item { SelfDestroyingRect { // ... } }
这会导致错误,因为对象只能是动态的 如果它们是动态创建的,则销毁。
因此,我同意mshefiti的正确解决方案(对于没有动态创建的项目):
grid.children = [];