删除QML Grid的子项

时间:2012-01-13 13:15:08

标签: javascript qt grid qml children

我想循环遍历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();
}

4 个答案:

答案 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)动态创建的对象。 此外,您应该避免删除自己未动态创建的对象

然后,答案是你不应该这样做!如果您想稍后删除它,请尝试动态创建对象。

Documentation

答案 3 :(得分:0)

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

Item {
    SelfDestroyingRect {
        // ...
    }
}
     

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

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

grid.children = [];