如何将变量用作QML元素id

时间:2017-05-07 01:06:59

标签: javascript qml

我的My QML文件中有100个相同类型的元素,其中“input0”到“input99”的id具有一个名为text的字符串类型的属性,我想使用循环将所有字符串推送到JavaScript中的数组 我试图使用这样的循环,但没有任何作用,数组仍然是空的:

function gather(){
var array=[]
for (var i =0;i<100;i++){
{array.push(("input"+i).text;
console.log(array[i];}
}

我得到以下日志:

(gather): qml: undefined

我在使用QtQuick 2.7

我该怎么做?

编辑:根据 derM 的建议,它尝试了以下方法:

Flickable{
    TextField{
        id:input1
        text:"text1"
    }
    TextField{
        id:input2
        text:"text2"
    }
    TextField{
        id:input3
        text:"text3"
    }
    TextField{
        id:input4
        text:"text4"
    }
    Component.onCompleted: {
        var textArray=[]
        for (var i = 1; i < 5; i++) {
            var c = Qt.createQmlObject("import QtQuick 2.0; QtObject { function f() { return input" + i + ".text } }", this, "none")
            textArray.push(c.f())
            console.log(textArray[i])
            c.destroy()
        }
    }
}

它仍然不起作用。我做错了什么?

1 个答案:

答案 0 :(得分:1)

如果你真的想要/需要通过id抓住它们,你需要从string转换为id,这不是很有效,而且无法完成('myStringHere')

我现在能想到的唯一方法是使用Qt.createQmlObject()创建动态对象,在其中创建一个包含函数的虚拟对象,返回所需的对象。

示例:

import QtQuick 2.6
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("PathView path test")

    Text {
        id: myText1
        text: "hallo"
    }

    Text {
        id: myText2
        text: "world"
    }

    Text {
        id: myText3
        text: "and"
    }

    Text {
        id: myText4
        text: "stuff"
    }

    property var textArray: []

    Component.onCompleted: {
        for (var i = 1; i < 5; i++) {
            var c = Qt.createQmlObject("import QtQuick 2.0; QtObject { function f() { return myText" + i + ".text } }", this, "none")
            textArray.push(c.f())
            c.destroy()
        }
        console.log(textArray)
    }
}

但是由于这个动态对象创建并不是最高效的,我宁愿不这样做。

如果偶然,所有这些inputXX都是同一父级的子级,您可能只需抓取父级children - 属性。如果您需要确保id合适,请将objectName设置为与you can't query the id相同的身份。

编辑由于所有输入都是同一GridLayout的子项,您可以继续第二种方法:循环遍历GridLayout.children ,就像这样:

function collectTexts() {
    var a = []
    for (var i = 0; i < children.length; i++) {
        if (children[i].text) {
            a.push(children[i].text)
        }
    }
    return a
}

由于可能有其他children具有text - 属性,因此建议设置objectName - 属性,例如到inputXX并检查objectName是否符合此模式,然后再将其添加到array

编辑:关于您的第二次尝试

在您尝试调整我的解决方案的代码中,我的代码部分很好。什么是行不通的,你如何处理数组。

你的循环以i = 1开头。因此,您成功将input1.text推送到数组中。然而,数组的索引以0开头,因此您刚刚推送的第一个元素位于textArray[0] - 您打印的textArray[1]仍为undefined - 因此输出。您只需更换行

即可修复该代码
console.log(textArray[i])

通过

console.log(textArray[i - 1])