如何从 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 属性,但没有'不存在。)

关于在委托中引用 modelmodelData,差异取决于模型的类型,而不是模型中角色的数量。如果模型是字符串列表或对象列表,则 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 的角色?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C++ 访问 QML ListView 委托项目?

如何在 QML 中的 Listview 中保留特定列表项之间的空间

如何在 Blackberry Cascades、QML 和 C++、QT 的列表视图中获取 Web 视图

在可扩展的 QML 应用程序中访问列表视图索引

在 Qt 中使用不同模型访问另一个列表视图的委托中的列表视图模型数据

如何在黑莓 10 级联 qml 中获取列表视图行数?