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



本质上,我有一个常用的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分配的委托,并查看javascript循环中mylistDelegateTextEnabled的值。例如,这个循环遍历当前列表,并为我提供模型中ListElement的文本:

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

唉,这似乎没那么容易。

感谢您的帮助。

您不能以这种方式访问委托,因为它们是由ListView自行创建和销毁的瞬态对象。如代表文档中所述:

委托会根据需要实例化,并且可能随时被销毁。状态永远不应存储在委托中。

为什么不能在ListModel中添加textEnabled标志?例如:

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

试试这个代码:-

 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

最新更新