QML迭代自定义元素和调用函数

时间:2013-03-07 12:09:02

标签: qt function qml loops

我有一个名为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()函数。

3 个答案:

答案 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()

一般来说,您应该避免需要手动迭代孩子的操作。但是,如果您尝试编写通常在每个子项上调用某些内容的代码,则您并不总是可以选择。