我有一个名为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个MenuButtons的列。我想迭代它们并调用函数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()函数。
答案 0 :(得分:2)
您可以使用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?
答案 1 :(得分:1)
根据我在QDeclarativePositioners class的源代码中看到的内容,您无法访问子元素!
但你可以改变你调用doStuff()方法的方式:你什么时候想要它被调用?经过一段时间后(然后将一个Timer元素添加到MenuButton中),或者当信号出现时?在后一种情况下,您可以使用Connections元素并侦听在您使用Column和Repeater的调用qml文件中发出的信号beign。
干杯,克里斯
答案 2 :(得分:1)
您可以通过所有QtObjects上存在的children属性访问元素的子元素。它包含一系列子元素,可以在javascript中自由访问。
例如。 element.children [0] .doStuff()
一般来说,您应该避免需要手动迭代孩子的操作。但是,如果您尝试编写通常在每个子项上调用某些内容的代码,则您并不总是可以选择。