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部分是可重用的组件,因此模型可以具有各种数据类型的任意数量的不同角色.我想要做的是绑定currentItem
ListView属性的给定角色的值.换句话说,我想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)