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

Posted

技术标签:

【中文标题】如何在 QML 中访问 ListView 的 ListModel 的 ListElement 的映射委托数据?【英文标题】:How to access a ListView's ListModel's ListElement's mapped delegate's data in QML? 【发布时间】: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);

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

帮助表示赞赏。

【问题讨论】:

【参考方案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;
   

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

【讨论】:

以上是关于如何在 QML 中访问 ListView 的 ListModel 的 ListElement 的映射委托数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QML 中进行基于状态的模型更改

qml listview实现循环

Qt/QML:在加载程序加载后访问 ListView 以跳转到特定项目/页面

QML , 如何从另一个 qml 访问元素

QML ListView 访问委托的项目

Qt中使用QML和Listview的问题