4

我想制作一个 items 子属性的深层副本。我已经尝试过这样的事情:

Item {
  property variant itemsCopy

  Component.onCompleted: {
    var tmp = otherItem.children
    itemsCopy = tmp
  }
}

但是当 otherItem.children 发生变化时(由于 Z 值不同而排序),itemsCopy也会发生变化。是否有解决方法来打破绑定或防止孩子被分类?我已经尝试过 Array s,list,没有任何效果。更改 tmp 的成员将被忽略。

4

2 回答 2

6

在 MartinJ 提供的示例中,所有对象都将通过引用进行复制。这是“面向对象的 JavaScript”一书中的经典深度复制功能:

function deepCopy(p, c) {
    var c = c || {};
    for (var i in p) {
        if (typeof p[i] === 'object') {
            c[i] = (p[i].constructor === Array) ? [] : {};
            deepCopy(p[i], c[i]);
        } else {
            c[i] = p[i];
        }
    }
    return c;
}
于 2012-07-09T07:13:25.300 回答
5

你可以自己复制一份:

import QtQuick 1.0

Item {
  property variant itemsCopy

  Component.onCompleted: {
    var tmp = otherItem.children
    var copy = []
    for (var i = 0; i < tmp.length; ++i)
        copy[i] = tmp[i]
    itemsCopy = copy;
  }
}

在 QtQuick 2.0 中,您可以使用它更容易一些property var

import QtQuick 2.0

Item {
  property var itemsCopy: []

  Component.onCompleted: {
    var tmp = otherItem.children
    for (var i = 0; i < tmp.length; ++i) 
        itemsCopy[i] = tmp[i]
  }
}
于 2012-07-06T06:12:22.677 回答