为什么必须分配一个新数组,以便删除每个动态对象(组件)?

时间:2019-06-07 18:03:51

标签: qt qml

我有一个在QML中使用的JS数组。在此数组中,我存储了许多动态对象(组件),这些对象是我创建并显示在应用程序窗口中的。我还有一个清除所有按钮,该按钮应该通过遍历该数组来删除所有项目。我先使用delete然后再使用shift()来删除项目,但是由于某种原因,并不是每个对象都被删除或删除。这是为什么?

这是无效的代码:

Button
{
    id: clearallButton
    width: 60
    height: 25
    text: qsTr("Clear all")

    onClicked:
    {
        for (var y = 0; y < canvas.componentvect.length; ++y)
        {
            canvas.componentvect[y].destroy();
            canvas.componentvect.shift();
        }                        
    }
}

这是一直为我工作的代码:

Button
{
    id: clearallButton
    width: 60
    height: 25
    text: qsTr("Clear all")

    onClicked:
    {
        for (var y = 0; y < canvas.componentvect.length; ++y)
        {
            canvas.componentvect[y].destroy();                            
        }
        var emptyvect=[];
        canvas.componentvect=emptyvect;
    }
}

当我尝试变体1时,它仅删除了一些对象,而有些仍然保留?这是为什么?我对每个对象调用delete,并shift()将其从数组中删除。难道不应该像示例2那样删除每个对象吗?

1 个答案:

答案 0 :(得分:1)

好吧,我现在感到非常愚蠢。通过在循环内使用shift(),迭代将无法正常进行,因为如果迭代变量破坏了位置0上的对象,然后我使用shift(),原本应该位于位置1上的对象将移至位置0。误会我的坏话。

这是更新的代码,它可以正常工作:

onClicked:
{
    while(canvas.componentvect.length !=0)
    {
        canvas.componentvect[0].destroy();
        canvas.componentvect.shift();
    }
}