我有一个自定义元素叫做MenuButton:
import QtQuick 1.1
import VPlay 1.0
Image {
property alias text: buttontext.text
property alias mouseArea: area
property alias fontBold: buttontext.font.bold
property alias textSize: buttontext.font.pixelSize
id: button
source: "img/cloudButton.png"
opacity: 1
Text {
id: buttontext
color: "black"
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 50
font.bold: true
}
MouseArea {
id: area
anchors.fill: parent
onPressed: button.opacity = 0.7
onReleased: button.opacity = 1.0
onCanceled: button.opacity = 1.0
}
function doStuff {
// do something here
}
width: 200
height: 60
}
现在,在我的主视图中,我有一个包含5个菜单按钮的列。我想遍历它们并调用doStuff()函数。我怎么做呢?我尝试了column.childAt(I)和类似的东西,没有任何效果。
MainView.qml
Rectangle {
width: 480; height: 320
// HERE IS MY PROBLEM, how do I iterate over all my elements in the column?
function update() {
for(var i = 0; i < 5; i++) {
column.childAt(i).doStuff(); // THIS IS WHAT I WANT TO DO
}
}
Column {
id: column
spacing: 5
anchors.centerIn: parent
Repeater {
id: repeater
model: 5
MenuButton {
id: levelbutton
text: "Level " + (modelData+1);
source: "img/cloud4.png"
}
}
}
}
问题在MainView.qml中的更新函数中我不知道如何遍历元素并调用doStuff()函数
你可以使用Component。onCompleted附加信号,像这样:
import QtQuick 1.0
Rectangle {
height: 600
width: 600
Repeater {
model: 5
Item {
Component.onCompleted: console.log('Component ' + index + ' completed!')
}
}
}
但是,请考虑,这个命令式操作是不好的,因为它将在模型更新后一直被调用。也许你有一个问题X,并问如何得到Y,(你认为)这将解决你的X?
从我在qdeclarativeposiators类的源代码中看到的情况来看,您无法访问子元素!
但是你可以改变你调用doStuff()方法的方式:你希望它什么时候被调用?一段时间过去后(然后添加一个计时器元素到您的菜单按钮),或当一个信号发生?在后一种情况下,您可以使用Connections元素,并在使用Column和Repeater的调用qml文件中监听开始发出的信号。
欢呼,克里斯
您可以通过存在于所有qobject上的children属性访问元素的子元素。它包含一个子元素数组,可以在javascript中自由访问。
。element.children [0] .doStuff ()
一般来说,您应该避免需要手动遍历子节点的操作。然而,如果您试图编写代码,一般调用每个子元素的一些东西,您并不总是有一个选择。