如何在QML中访问ListView的ListModel的ListElement的映射委托数据?

时间:2012-03-19 18:34:36

标签: javascript qt qml

基本上,我有一个通常的ListView:

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);
}
唉,它似乎并不那么容易。

帮助表示赞赏。

2 个答案:

答案 0 :(得分:7)

您无法以这种方式访问​​委托,因为它们是瞬态对象,由ListView自行决定创建和销毁。正如代表documentation中所述:

  

代表会根据需要进行实例化,并且可能随时被销毁。   国家不应该存储在代表中。

是否有一个特殊原因导致您无法向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

    }      
}

答案 1 :(得分: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