删除QML Grid的子项

ale*_*lex 8 javascript grid qt children qml

我想循环遍历QML Grid的子节点并使用Javascript销毁它们中的每一个.

Grid {
  id: contentGrid
  spacing: 10

  ImageItem { imageSource: "file:/foo.jpeg"  } // destroy this
  ImageItem { imageSource: "file:/bar.jpeg"  } // destroy this as well
}
Run Code Online (Sandbox Code Playgroud)

我试着做这样的事情,但到目前为止还没有.

for(var i = 0; contentGrid.children.length() < i; i++) {
    contentGrid.childAt(i).destroy();
}
Run Code Online (Sandbox Code Playgroud)

Wes*_*ker 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()
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 哈哈!最好的部分是我必须回来找到自己的答案,记住如何做到这一点! (17认同)
  • 正如@quetzalcoatl建议的那样,按顺序删除子项会起作用,但是如果你有一个很大的子列表,它会慢很多,因为每次你破坏第0个元素时,所有其他元素都必须向下移动,即使它们是关于无论如何要被删除.向后执行将是O(n),而向前执行将是O(n ^ 2). (5认同)