22

我正在尝试从 QML 中的 ListView 访问角色。本质上,我的 QML 中有这个:

ListView {
    id: myId
    model: myModel
    delegate: Item {
        Text {
            text: model.text
        }
        Text {
            text: model.moreText
        }
    }
}

myModel是一个 QAbstractListModel 实现。其中的 QML 部分是一个可重用的组件,因此该模型可以具有具有各种数据类型的任意数量的不同角色。我想做的是绑定到currentItemListView 属性的给定角色的值。换句话说,我想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 脚本中使用数据时遇到类型错误,并且没有可用的类型转换,所以我不知道该怎么做。欢迎任何建议!

谢谢!

杰克

4

3 回答 3

30

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代码不起作用,因为它试图引用您的委托中不存在的文本属性。)

In regards to referring to model vs modelData within the delegate, the difference depends on the type of the model, rather than the number of roles in the model. If the model is a string list or object list, modelData is used to refer to the individual string or object from within a delegate (since string lists and object lists do not have any roles). For all other models, including the QML ListModel and the Qt C++ QAbstractItemModel, model.role can be used to refer to a role within a delegate.

于 2011-03-09T00:00:06.917 回答
6

You could alternatively access the model directly, with something like

Text { text: myModel[myId.currentIndex].text }
于 2011-05-20T12:42:22.773 回答
3

You can access a ListElement of ListModel using get() function.

Text { text: myModel.get(myId.currentIndex).text }
于 2016-08-30T08:57:17.977 回答