我的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()
}
}
}
它仍然不起作用。我做错了什么?
答案 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])