2014-02-25 21 views
1

是否可以通過使用for循環或以任何其他方式創建矩形的一定數量的副本,並且具有更改每個矩形屬性(如x,y,寬度等)的能力。使用QML在Qml中自動複製矩形

我曾嘗試以下:

var x = 0 
var t = 80 
var z = 125 
var Rectangle = [] 
if(rs.rows.length > 0){ 
    x = 2 
    for(var i = 0; i < rs.rows.length; i++){ 
    Rectangle[i] = rectangle18 
    Rectangle[i].x = t 
    Rectangle[i].y = z 
    Rectangle[i].visible = true 

    t = t - 40 
    z = z - 7 
    } 
} 

但不幸的是這不是我的工作,有沒有做這方面的工作

回答

1

的一種方式這不是那麼簡單。您需要使用Qt.createComponent and that object's createObject() call來達到您想要的效果。這不僅僅是創建矩形然後複製它的問題,您需要分別從qml文件加載每個新副本。

喜歡的東西:

var rects = [] 
var creator = Qt.createComponent("myRect.qml") 
for (var i = 0; i < 10; i++) { 
    rects[i] = creator.createObject(PARENT) 
    rects[i].x = ... 
} 

顯然,外推到你所需要的。請注意對PARENT的引用,PARENT是最終應該包含矩形的對象,通常是像Grid這樣的容器。

+0

哇你讓我看起來很複雜:)。是否有可能複製矩形使用像屬性varient rects = [] – m7md

+0

不,它不是。上面的方法在內部做着非常特殊的事情,比如在下面創建一個新的C++對象來容納qml對象。不幸的是,你不能克隆一個我知道的參考。當我第一次遇到這個時,我也很驚訝。但是,你很快就習慣了。這只是你想要的。 –

1

如果您不想使用Qt.CreateComponent方法,您還可以考慮使用Repeater組件和ListModel,其中包含每個Rectangle的信息。下面是一個例子放置4 Rectangle場景:

ListModel { 
    id: modelRects 
    ListElement { _x: 0; _y:0 ; _width: 10; _height: 10; _color: "red" } 
    ListElement { _x: 100; _y:0 ; _width: 20; _height: 20; _color: "blue" } 
    ListElement { _x: 0; _y:100 ; _width: 30; _height: 30; _color: "yellow" } 
    ListElement { _x: 100; _y:100 ; _width: 40; _height: 40; _color: "green" } 
} 

Repeater { 
    model: modelRects 
    delegate: Rectangle { 
    width: _width 
    height: _height 
    x: _x 
    y: _y 
    color: _color 
    } 
} 

如果你不想創建ListModel你也可以基於該元素的index你的計算。這裏是一個例子,根據指數增長Rectangle

Repeater { 
    model: 5 
    delegate: Rectangle { 
    // Index starts at 0 so you want a width higher than 0 on first element 
    width: 10 * (index + 1) 
    height: 10 * (index + 1) 
    x: 50 * index 
    y: 50 * index 
    color: "red" 
    } 
}