Удалить потомков QML Grid - PullRequest
       23

Удалить потомков QML Grid

8 голосов
/ 13 января 2012

Я хочу перебрать детей в 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 ]

13 голосов
/ 13 января 2012

У вас есть ряд проблем в вашей попытке выше ... Во-первых, вам нужно будет выполнить итерацию в обратном направлении, потому что вы будете перемещать содержимое потомков вниз по мере продвижения (т. Е. Если вы удалите номер 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()
      }
    }
  }
}
3 голосов
/ 17 августа 2015

Я просто хочу скопировать и вставить фрагмент из документации:

Обратите внимание, что вы никогда не должны вручную удалять объекты, которые были динамически созданы удобными фабриками объектов QML (такими как Loader и Repeater). Кроме того, вам следует избегать удаления объектов, которые вы сами не создавали динамически .

Тогда ответ - ВЫ НЕ ДОЛЖНЫ это делать!Попробуйте создать объект динамически, если вы хотите удалить его позже.

Документация

3 голосов
/ 25 декабря 2014

или вы можете просто сказать: grid.children = "";

0 голосов
/ 30 июля 2017

В дополнение к ответу Атрона обратите внимание, что в документации прямо упоминается, что destroy статически созданный объект вручную не допускается:

Item {
    SelfDestroyingRect {
        // ...
    }
}

приведет к ошибке, поскольку объекты могут быть динамически уничтожены, только если они были созданы динамически.

Поэтому я согласен с mshefiti, что правильное решение (для элементов, которые не создаются динамически):

grid.children = [];
...