【问题标题】:How to access a ListView's ListModel's ListElement's mapped delegate's data in QML?如何在 QML 中访问 ListView 的 ListModel 的 ListElement 的映射委托数据?
【发布时间】:2012-03-19 18:34:36
【问题描述】:

基本上,我有一个常用的 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);
}

唉,这似乎并不那么容易。

帮助表示赞赏。

【问题讨论】:

    标签: javascript qt qml


    【解决方案1】:

    您不能以这种方式访问​​委托,因为它们是 transient 对象,由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
    
        }      
    }
    

    【讨论】:

    • 感谢您的回答!我试过并得到错误:无法分配给只读属性“textEnabled”。是的,我想从 QML 而不是 JS 分配。我可以这样做吗?
    • 我认为您尝试从委托中设置 textEnabled 标志的错误将不起作用。相反,直接使用model.setProperty() 更新模型。我将更新我的答案以这种方式进行演示,而不是使用Component.onCompleted
    【解决方案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;
       }

    希望这会有所帮助, 干杯!!! @导航

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 2023-03-25
      相关资源
      最近更新 更多