1

我有一个名为 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) 之类的东西,但没有任何效果。

主视图.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() 函数。

4

3 回答 3

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?

于 2013-03-07T13:49:39.473 回答
1

从我在QDeclarativePositioners 类的源代码中看到的内容,您无法访问子元素!

但是您可以改变调用 doStuff() 方法的方式:您希望何时调用它?经过一段时间后(然后将 Timer 元素添加到您的 MenuButton),或者当信号发生时?在后一种情况下,您可以使用 Connections 元素并收听在您使用 Column 和 Repeater 的调用 qml 文件中发出的信号。

干杯,克里斯

于 2013-03-07T13:05:46.567 回答
1

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

例如。element.children[0].doStuff()

一般来说,您应该避免需要手动迭代子级的操作。但是,如果您尝试编写对每个孩子进行通用调用的代码,您并不总是有选择的余地。

于 2013-03-07T16:37:32.683 回答