2012-03-19 34 views
6

從本質上講,我有一個平常的ListView:如何在QML中訪問ListView的ListModel的ListElement的映射委託的數據?

Rectangle { 
    id: mylist 

    ListModel { 
     id: mylistModel 
     ListElement { 
      text: "blah1" 
     } 
     ListElement { 
      text: "blah2" 
     } 
     ListElement { 
      text: "blah3" 
     } 
    } 

    Component { 
     id: mylistDelegate 

     Text { 
      id: mylistDelegateText 
      text: text 
      property bool mylistDelegateTextEnabled: false 
     } 
    } 

    ListView { 
     id: mylistView 
     model: mylistModel 
     delegate: mylistDelegate 
    } 
} 

請忽略我可能會被截斷碼把重點放在什麼是重要的紛紛出臺任何問題。

反正現在我的問題是,我想訪問一個ListElement分配的代表,看看mylistDelegateTextEnabled的值是一個javascript循環。例如,此循環遍歷當前列表並給出模型中的ListElements的文本:

for(var i = 0; i < mylistModel.count; ++i) { 
    console.log(mylistModel.get(i).text); 
} 

這顯然工作正常。

現在我想基本上是這樣的:它似乎

for(var i = 0; i < mylistModel.count; ++i) { 
    console.log(mylistModel.get(i).text); 
    console.log(mylistModel.get(i).delegate.mylistDelegateTextEnabled); 
} 

唉,並不那麼容易。

幫助讚賞。

回答

5

您不能以這種方式訪問​​代表,因爲它們是瞬態ListView決定創建和銷燬的對象。正如documentation爲代表解釋說:

Delegates are instantiated as needed and may be destroyed at any time. State should never be stored in a delegate.

有什麼特別的原因,你不能只是增加一個textEnabled標誌的ListModel?例如:

import QtQuick 1.0 

Rectangle { 
    id: mylist 
    width:300 
    height:300 

    ListModel { 
     id: mylistModel 
     ListElement { 
      name: "blah1" 
      textEnabled:false 
     } 
     ListElement { 
      name: "blah2" 
      textEnabled:false 
     } 
     ListElement { 
      name: "blah3" 
      textEnabled:false 
     } 
    } 

    Component { 
     id: mylistDelegate 

     Text { 
      id: mylistDelegateText 
      text: name 
      color: textEnabled?"red":"black" 


      MouseArea { 
       anchors.fill:parent; 
       onClicked: { 
        mylistModel.setProperty(index, "textEnabled", !textEnabled); 
       } 
      } 
     } 
    } 

    ListView { 
     id: mylistView 
     model: mylistModel 
     delegate: mylistDelegate 
     width:100; 
     height:100 

    }  
} 
+0

感謝您的回答!我試過並得到錯誤:無法分配給只讀屬性「textEnabled」。是的,我想從QML而不是JS分配。我可以這樣做嗎? – Svenstaro 2012-03-25 13:45:38

+1

我想從錯誤中試圖設置代理內的'textEnabled'標誌,這將不起作用。相反,使用'model.setProperty()'直接更新模型。我會更新我的答案以便以這種方式演示它,而不是使用'Component.onCompleted'。 – 2012-03-25 14:05:35

+0

這很完美,謝謝。 – Svenstaro 2012-03-27 20:30:02

2

試試這個代碼: -

for (var i = 0; i < mylistView.count; i ++) { 
 
     // this will get list item at index i 
 
     console.log(mylistView.contentItem.children[i]); 
 

 
     // lets set it height to 100 
 
     mylistView.contentItem.children[i].height=100; 
 
    }

希望這有助於 歡呼聲! @navi