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

如何从QML中的listview访问currentItem的角色?,listview,roles,qml,qabstractlistmodel,Listview,Roles,Qml,Qabstractlistmodel,我正在尝试从QML中的列表视图访问角色。基本上,我的QML中包含以下内容: ListView { id: myId model: myModel delegate: Item { Text { text: model.text } Text { text: model.moreText } } } myModel是一个QAbstractListMode

我正在尝试从QML中的列表视图访问角色。基本上,我的QML中包含以下内容:

ListView {
    id: myId
    model: myModel
    delegate: Item {
        Text {
            text: model.text
        }
        Text {
            text: model.moreText
        }
    }
}
myModel
是一个QAbstractListModel实现。其中的QML部分是一个可重用的组件,因此模型可以具有任意数量的不同角色和不同的数据类型。我想做的是绑定到ListView的
currentItem
属性的给定角色的值。换句话说,我希望页面上有一些其他
组件
,可以将属性绑定到ListView中当前选定的项,如下所示:

Text {
    text: myId.currentItem.text // Or myId.currentItem.model.text (or something similar)
}
请记住,我需要这个通用的,因为我会为许多模型类型做很多这样的工作,我不会为每个模型和ListView编写那种自定义代码

似乎访问当前所选项目的属性应该很简单,但据我所知,这是不可能的。当只有一个角色时,模型的处理方式似乎有所不同,这一事实使问题更加复杂。我的意思是,有时您可以通过
model.roleName
访问您的角色,而当只有一个角色时,您可以使用
modelData

如果有人有任何建议,我将不胜感激。非常感谢

编辑

我发现:

然而,这似乎不适合我。当我尝试使用QML脚本中的数据时,我遇到了类型错误,并且没有可用的类型转换,因此我不确定该怎么做。欢迎提出任何建议

谢谢

Jack

处的代码应该可以工作,尽管如果属性名为“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 }
(原始帖子中的myId.currentItem.text代码无效,因为该代码试图引用委托中不存在的文本属性。)


关于在委托中引用模型与模型数据,差异取决于模型的类型,而不是模型中角色的数量。如果模型是字符串列表或对象列表,则modelData用于引用委托中的单个字符串或对象(因为字符串列表和对象列表没有任何角色)。对于所有其他模型,包括QML ListMod和Qt C++ QAcExcTimeMead,Mult..Prime'可以用来引用委托中的角色。

< P>您可以直接用类似于

的方式访问模型。
Text { text: myModel[myId.currentIndex].text }

可以使用get()函数访问ListModel的ListElement

Text { text: myModel.get(myId.currentIndex).text }

非常感谢您的回复!隐马尔可夫模型。。。我想我已经尝试了很多次了,但是我可能错过了一些细微的差别。很高兴知道它为某人工作!我将再次尝试这个解决方案,看看它是否奏效。我感谢model.role和modelData之间的澄清。我会让你知道事情的结果。再次感谢!看起来它确实有用。不知道我以前错过了什么。不管是哪种方式,这个解决方案花了几个小时才找到,希望现在它在StackOverflow上,其他人也能很快找到它。再次感谢!有没有办法对不同的模型类型进行抽象?我想问一下,因为我想在测试过程中使用QML列表模型和C++应用程序中的对象列表,使用相同的QML代码。有没有办法让这个方法与组合框一起工作?没有
currentItem
…很好。我不必将“model”作为别名,但通过向ListView委托添加属性,我可以从例如“onCurrentIndexChanged”中查询值handler。请您详细说明您的答案,再添加一点关于您提供的解决方案的描述好吗?@abarisone myModel是您将提供给ListView的模型,myId是ListView,text是角色。例如,
ListModel{id:myModel ListElement{text:“苹果”成本:2.45}ListElement{text:“橙色”成本:3.25}ListElement{text:“香蕉”成本:1.95}ListView{id:myId锚定。填充:父模型:myModel委托:text{Te:Te}} /Cord>这是假设即使在C++中定义的模型也是有效的吗?因为我不能使它有效。它说属性get没有被定义。@ SavaVase:C++模型的类型是什么?它是SQL数据库中存储的QAcExtCART列表。这似乎不起作用:Type Error:无法读取未定义的属性“text”。