如何从 QML 中的列表视图访问 currentItem 的角色?
Posted
技术标签:
【中文标题】如何从 QML 中的列表视图访问 currentItem 的角色?【英文标题】:How do you access the roles of the currentItem from a listview in QML? 【发布时间】:2011-07-11 01:16:46 【问题描述】:我正在尝试从 QML 中的 ListView 访问角色。基本上,我的 QML 中有这个:
ListView
id: myId
model: myModel
delegate: Item
Text
text: model.text
Text
text: model.moreText
myModel
是一个 QAbstractListModel 实现。其中的 QML 部分是一个可重用的组件,因此该模型可以具有具有各种数据类型的任意数量的不同角色。我想做的是绑定到 ListView 的currentItem
属性的给定角色的值。换句话说,我想在页面上有一些其他的Component
可以将属性绑定到 ListView 中当前选定的项目,如下所示:
Text
text: myId.currentItem.text // Or myId.currentItem.model.text (or something similar)
请记住,我需要这个通用可用的,因为我会为许多模型类型做很多这样的事情,并且我试图不为每个模型和 ListView 编写那种自定义代码。
似乎访问当前选定项目的属性应该很简单,但据我所知这是不可能的。当只有一个角色时,模型似乎受到不同的对待,这一事实使问题变得更加复杂。我的意思是有时您通过model.roleName
访问您的角色,而当只有一个角色时您使用modelData
。
如果有人有任何建议,我将不胜感激。非常感谢!
编辑
我发现了这个:
http://comments.gmane.org/gmane.comp.lib.qt.qml/1778
但是,这似乎对我不起作用。当我尝试在 QML 脚本中使用数据时遇到类型错误,并且没有可用的类型转换,所以我不知道该怎么做。欢迎提出任何建议!
谢谢!
杰克
【问题讨论】:
【参考方案1】:http://comments.gmane.org/gmane.comp.lib.qt.qml/1778 的代码应该可以工作,但如果属性名为“数据”,我确实会看到错误;看起来它正在覆盖一些现有的内置属性。将其重命名为“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
(原始帖子中的 myId.currentItem.text 代码不起作用,因为它试图引用您的委托中的 text 属性,但没有'不存在。)
关于在委托中引用 model 与 modelData,差异取决于模型的类型,而不是模型中角色的数量。如果模型是字符串列表或对象列表,则 modelData 用于引用委托中的单个字符串或对象(因为字符串列表和对象列表没有任何作用)。对于所有其他模型,包括 QML ListModel 和 Qt C++ QAbstractItemModel,model.role 可用于引用委托中的角色。
【讨论】:
非常感谢您的回复!嗯...我想尽一切办法尝试了这个,但我可能错过了一些细微差别。很高兴知道它对某人有用!我会再次尝试这个解决方案,看看是否能解决问题。我很欣赏 model.role 和 modelData 之间的澄清。我会让你知道事情的结果。再次感谢! 看起来确实有效。不知道我以前错过了什么。无论哪种方式,这个解决方案都需要几个小时才能找到,所以现在希望它在 *** 上,其他人将能够快速找到它。再次感谢! 有没有办法抽象出不同的模型类型?我问是因为我想在测试期间处理 QML ListModel 并使用相同的 QML 代码在 C++ 应用程序中处理对象列表。 任何想法让这种相同的方法与 ComboBox 一起工作?没有currentItem
...
不错。我不必像这样为“模型”起别名,但是将属性属性添加到 ListView 委托允许我从例如“onCurrentIndexChanged”处理程序中查询值。【参考方案2】:
您也可以直接访问模型,例如
Text text: myModel[myId.currentIndex].text
【讨论】:
这似乎不起作用:TypeError: Cannot read property 'text' of undefined【参考方案3】:您可以使用 get() 函数访问 ListModel 的 ListElement。
Text text: myModel.get(myId.currentIndex).text
【讨论】:
能否请您详细说明您的答案,添加更多关于您提供的解决方案的描述? @abarisone myModel 是您将提供给 ListView 的模型,myId 是 listView,而 text 是一个角色。例如ListModel id: myModel ListElement text: "Apple" cost: 2.45 ListElement text: "Orange" cost: 3.25 ListElement text: "Banana" cost: 1.95 ListView id: myId anchors.fill: parent model: myModel delegate: Text text: text
即使模型是用 c++ 定义的,这是否应该工作?因为我似乎无法让它工作。它说属性 get 没有定义。
@Savvas 你的 C++ 模型是什么类型的?
这是一个存储在 SQL 数据库中的 QAbstractList。以上是关于如何从 QML 中的列表视图访问 currentItem 的角色?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 QML 中的 Listview 中保留特定列表项之间的空间
如何在 Blackberry Cascades、QML 和 C++、QT 的列表视图中获取 Web 视图