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



我有一个自定义元素叫做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 ()

一般来说,您应该避免需要手动遍历子节点的操作。然而,如果您试图编写代码,一般调用每个子元素的一些东西,您并不总是有一个选择。

相关内容

  • 没有找到相关文章

最新更新