我正在尝试从QML中的ListView访问角色。本质上,我的QML中包含以下内容:

ListView {
    id: myId
    model: myModel
    delegate: Item {
        Text {
            text: model.text
        }
        Text {
            text: model.moreText
        }
    }
}
myModel是QAbstractListModel实现。其QML部分是可重用的组件,因此该模型可以具有各种数据类型的许多不同角色。我想做的是绑定(bind)到ListView的currentItem属性的给定角色的值。换句话说,我想在页面上有一些其他的Component,可以将属性绑定(bind)到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脚本中使用数据时遇到类型错误,并且没有类型转换可用,因此我不确定该怎么做。欢迎任何建议!

谢谢!

插口

最佳答案

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 }

(原始文章中的myId.currentItem.text代码不起作用,因为它试图引用委托(delegate)中的text属性,该属性不存在。)

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

10-07 19:20
查看更多