如何从QML中的listview访问currentItem的角色?

Jac*_*son 20 listview roles qml qabstractlistmodel

我正在尝试从QML中的ListView访问角色.基本上,我在我的QML中有这个:

ListView {
    id: myId
    model: myModel
    delegate: Item {
        Text {
            text: model.text
        }
        Text {
            text: model.moreText
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

myModel是一个QAbstractListModel实现.QML部分是可重用的组件,因此模型可以具有各种数据类型的任意数量的不同角色.我想要做的是绑定currentItemListView属性的给定角色的值.换句话说,我想Component在页面上有一些可以将属性绑定到ListView中当前选定项目的其他内容,如下所示:

Text {
    text: myId.currentItem.text // Or myId.currentItem.model.text (or something similar)
}
Run Code Online (Sandbox Code Playgroud)

请记住,我需要这个一般可用,因为我将为许多模型类型做很多事情,我试图不为每个模型和ListView编写那种自定义代码.

看起来访问当前所选项目的属性应该很简单,但据我所知,这是不可能的.当只有一个角色时,模型似乎被区别对待,这个问题更加复杂.我的意思是,有时您通过model.roleName而不是只使用一个角色来访问您的角色modelData.

如果有人有任何建议,我会非常感激.非常感谢!

编辑

我找到了这个:

http://comments.gmane.org/gmane.comp.lib.qt.qml/1778

但是,这似乎对我没用.当我尝试在我的QML脚本中使用数据时,我遇到类型错误,并且没有可用的类型转换,所以我不知道该怎么做.欢迎任何建议!

谢谢!

插口

小智 27

http://comments.gmane.org/gmane.comp.lib.qt.qml/1778上的代码应该可以使用,但如果属性名为'data',我确实会看到错误; 看起来它覆盖了一些现有的内置属性.将其重命名为'myData'似乎有效:

ListView {
    id: myId
    model: myModel
    delegate: Item {
        property variant myData: model
        Text {
            text: model.text
        }
        Text {
            text: model.moreText
        }    
    }
}

Text { text: myId.currentItem.myData.text }
Run Code Online (Sandbox Code Playgroud)

(原始帖子中的myId.currentItem.text代码不起作用,因为这是试图引用代理中的文本属性,但不存在.)

关于在委托中引用model vs modelData,差异取决于模型的类型,而不是模型中的角色数.如果模型是字符串列表或对象列表,则modelData用于从委托中引用单个字符串或对象(因为字符串列表和对象列表没有任何角色).对于所有其他模型,包括QML ListModel和Qt C++ QAbstractItemModel,model.role可用于引用委托中的角色.


小智 6

您也可以直接访问模型,例如

Text { text: myModel[myId.currentIndex].text }
Run Code Online (Sandbox Code Playgroud)