2014-02-25 23 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" 
    } 
}