2012-07-05 22 views
3

我想製作項目子項目的深層副本。我試過的東西沿着線:QML項目的子項目深度複製

Item { 
    property variant itemsCopy 

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

但當otherItem.children改變(排序由於不同的Z值),itemsCopy也發生了變化。是否有解決方法來打破綁定或防止孩子被分類的方法?我試過Array s,列表,沒有任何作用。更改tmp的成員將被忽略。

回答

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] 
    } 
} 
+0

看起來可以工作,即使項目的附加屬性變得不可訪問。 – user1095108 2012-07-06 07:53:20

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; 
}