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

sve*_*aro 7 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
    }
}
Run Code Online (Sandbox Code Playgroud)

请忽略我可能通过截断代码以关注重要内容而引入的任何问题.

无论如何,现在我的问题是我想访问ListElement的已分配委托,并查看mylistDelegateTextEnabled在javascript循环中的值.例如,这个循环迭代当前列表并给出模型中ListElements的文本:

for(var i = 0; i < mylistModel.count; ++i) {
    console.log(mylistModel.get(i).text);
}
Run Code Online (Sandbox Code Playgroud)

这显然很好.

现在我想要的基本上是这样的:

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

唉,它似乎并不那么容易.

帮助赞赏.

Pau*_*ond 7

您无法以这种方式访问​​委托,因为它们是由您自行决定创建和销毁的临时对象ListView.如代表文档中所述:

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

有什么特别的原因你不能只为它添加一个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

    }      
}
Run Code Online (Sandbox Code Playgroud)