2012-03-19 13 views
6

Zasadniczo mam zwykły ListView:Jak uzyskać dostęp do zmapowanych danych delegowanych przez ListView w ListModel w QML?

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 
    } 
} 

zignoruj ​​żadnych problemów mógłbym wprowadzanych przez obcinanie kod, aby skupić się na tym, co ważne.

W każdym razie, teraz moim problemem jest to, że chcę uzyskać dostęp do przypisanego delegata ListElement i zobaczyć, jaka jest wartość mylistDelegateTextEnabled w pętli javascript. Na przykład pętla iteruje nad bieżącą listą i podaje mi tekst ListElementów w modelu:

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

To oczywiście działa dobrze.

Teraz to, co chcę jest zasadniczo to:

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

Niestety, to nie wydaje się być takie proste.

Pomoc doceniona.

Odpowiedz

5

Nie można uzyskać dostępu do delegatów w ten sposób, ponieważ są one przejściowe obiektów, które są tworzone i niszczone według uznania ListView. Jak wyjaśniono w documentation dla uczestników:

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

Czy istnieje szczególny powód, dlaczego nie można po prostu dodać textEnabled flagę do ListModel? Na przykład:

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

Dzięki za odpowiedź! Próbowałem tego i otrzymałem błąd: Nie można przypisać do właściwości tylko do odczytu "textEnabled". Tak, chciałbym wykonać przypisanie z QML zamiast z JS. Czy mogę to zrobić? – Svenstaro

+1

Myślę, że z powodu błędu próbujesz ustawić flagę 'textEnabled' z poziomu delegata, który nie będzie działał. Zamiast tego zaktualizuj model bezpośrednio, używając 'model.setProperty()'. Zaktualizuję moją odpowiedź, aby zademonstrować to w ten sposób, zamiast używać "Component.onCompleted". –

+0

To idealne, dzięki. – Svenstaro

2

Spróbuj ten kod: -

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; 
 
    }

Nadzieja to pomaga, okrzyki !!! @navi

Powiązane problemy