Qt 在自定义元素上迭代并调用函数的QML

Qt 在自定义元素上迭代并调用函数的QML,qt,function,qml,loops,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 sour

我有一个名为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.childAti之类的东西,都没用

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函数。

从中的源代码中可以看出,您无法访问子元素

但是您可以改变调用dostaff方法的方式:您希望何时调用它?经过一段时间后,然后在菜单按钮中添加一个计时器元素,或者在信号出现时添加?在后一种情况下,您可以使用Connections元素并监听调用qml文件中发出的信号,在该文件中使用列和中继器


干杯,克里斯

从我在中的源代码中看到,您无法访问children元素

但是您可以改变调用dostaff方法的方式:您希望何时调用它?经过一段时间后,然后在菜单按钮中添加一个计时器元素,或者在信号出现时添加?在后一种情况下,您可以使用Connections元素并监听调用qml文件中发出的信号,在该文件中使用列和中继器

干杯,克里斯你可以使用附加信号,如下所示:

import QtQuick 1.0

Rectangle {
    height: 600
    width: 600

    Repeater {
        model: 5
        Item {
            Component.onCompleted: console.log('Component ' + index + ' completed!')
        }
    }
}
但是,请注意,这个命令操作不好,因为它将被称为模型更新后的所有时间。可能您遇到了问题X并询问如何获得Y,您认为这将解决您的X?

您可以使用附加信号,如下所示:

import QtQuick 1.0

Rectangle {
    height: 600
    width: 600

    Repeater {
        model: 5
        Item {
            Component.onCompleted: console.log('Component ' + index + ' completed!')
        }
    }
}

但是,请注意,这个命令操作不好,因为它将被称为模型更新后的所有时间。可能您遇到了问题X并询问如何获得Y,您认为这将解决您的X?

您可以通过存在于所有QTObject上的children属性访问元素的子元素。它包含一个子元素数组,可以在javascript中自由访问

例如,element.children[0].doStuff


一般来说,您应该避免需要手动迭代子级的操作。但是,如果您试图编写在每个子元素上泛型调用某些内容的代码,您并不总是有选择。

您可以通过存在于所有对象上的children属性访问元素的子元素。它包含一个子元素数组,可以在javascript中自由访问

例如,element.children[0].doStuff


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

在MenuButton.qml中侦听信号是否明智?因为我无法访问中继器/列的子级?是的,正是我的意思!您可以使用Connections元素并将target属性设置为您的调用代码,例如矩形并侦听您在那里发出的信号。如果您从更大的角度解释您的情况,我们可能会找到更好的解决方案。倾听MenuButton.qml中的信号是否明智?因为我无法访问中继器/列的子级?是的,正是我的意思!您可以使用Connections元素并将target属性设置为您的调用代码,例如矩形并侦听您在那里发出的信号。如果你从更大的角度解释你的情况,我们可能会找到更好的解决方案。