2017-05-07 86 views
0

我在我的QML文件中有一個100元素的「input0」到「input99」的id,它具有一個名爲text的字符串類型的屬性,我想要使用一個循環來推動所有的字符串轉換成在JavaScript 一個數組我試圖用一個循環像這樣和但沒有任何工程和陣列保持爲空:如何使用一個變量作爲QML元素ID

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

我該怎麼做?

編輯:隨着真皮的建議,它嘗試了以下內容:

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

修復代碼這些輸入孩子的'Item'? – derM

+0

它的TextField的大部分元素 –

+0

我沒有問,你的輸入是什麼樣的'Item'。我正在問他們的父母。他們都是同一個「物品」的孩子嗎? – derM

回答

0

如果你真的想/需要通過你需要從string轉化爲一個id,這是不是很高性能,並且不能與('myStringHere')id抓住他們。

我現在唯一能想到的方法是使用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設置爲與id相同,如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 -property,建議設置objectName屬性,例如到inputXX並檢查objectName是否匹配此模式,然後將其添加到array


編輯:關於你提到的第二個嘗試

在代碼中,在那裏你努力去適應我的解決方案,我的代碼的部分都很好。什麼不行,是你如何處理陣列。

您的循環以i = 1開頭。因此,您成功將input1.text推入陣列。然而,陣列的索引以0開頭,因此您剛剛推送的第一個元素是textArray[0] - 您打印的textArray[1]仍然是undefined - 因此是此輸出。你可以通過簡單地替換線

console.log(textArray[i]) 

通過

console.log(textArray[i - 1]) 
+0

動態對象創建無法正常工作導致每個輸入在屏幕上都有不同的名稱和位置 –

+0

您只創建虛擬對象,它將爲您訪問,而不是「輸入」本身。唯一需要確認的是動態對象在正確的範圍內,以解析id名稱。 – derM

+0

你應該嘗試一下建議的代碼,然後說,它不起作用。 – derM

相關問題