Javascript 删除QML网格的子级

Javascript 删除QML网格的子级,javascript,qt,grid,qml,children,Javascript,Qt,Grid,Qml,Children,我想循环一个QML网格的子网格,并使用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;

我想循环一个QML网格的子网格,并使用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();
}
for(var i=0;contentGrid.children.length()
您在上述尝试中遇到了许多问题。。。首先,您需要向后迭代,因为您将在前进时向下移动子对象的内容(即,如果您删除#1,数字#2将成为子对象#1,然后您将删除#2,这将是旧的子对象#3)

其次,您需要以不同的方式访问孩子。函数的作用是将子对象定位在屏幕上特定的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()
      }
    }
  }
}

或者你可以说:
grid.children=“”

我只想从文档中复制并粘贴一个片段:

请注意,您永远不应该手动删除由便利QML对象工厂(如Loader和Repeater)动态创建的对象此外,您应该避免删除那些不是自己动态创建的对象

那么,答案是你不应该这样做!如果以后要删除该对象,请尝试动态创建该对象


作为对Atron答案的补充,请注意,明确提到不允许手动销毁静态创建的对象:

这将导致错误,因为对象只能动态地 如果它们是动态创建的,则会被销毁

因此,我同意mshefiti的观点,正确的解决方案(对于非动态创建的项目)是:


哈哈!最棒的是我必须回来找到我自己的答案,记住如何做到这一点!在向后的上下文中:如果销毁会对子集合重新编号,为什么不在(grid.children.length>0)grid.children[0].destroy()时删除子集合?按照@quetzalcatl建议的顺序向前删除子集合是可行的,但是如果子集合的列表很大,则速度会慢得多,因为每次销毁第0个元素时,所有其他元素都必须向下移动,即使它们即将被删除。向后做是O(n),向前做是O(n^2)。@WesHardaker你对其他答案有什么看法?尤其是Atron的一个表明你的方法违反了文档?@m7913d:我认为这是一个正确的观点。当我使用上面的方法时,这是因为我已经动态地创建了它们。这实际上是有效的,我只是想知道,与另一个答案()中更复杂的解决方案相比,它在性能/内存消耗方面的表现如何()@mozzbozz没有循环,所以我猜它的表现更好。但我仍然不太熟悉性能度量。我的测试表明,子项没有被销毁,而是保留在内存中。@HansOne如果是这种情况(对于静态创建的项),那么它似乎是一个bug,应该使用向Qt报告。手动销毁它们可能适用于您当前的Qt版本,但不能保证它在将来的版本中会起作用。还说“请注意,如果像这样静态创建SelfDestroyingRect实例:
Item{SelfDestroyingRect{//…}}
,这将导致错误,因为只有动态创建项才能动态销毁。”
Item {
    SelfDestroyingRect {
        // ...
    }
}
grid.children = [];