我有一个TableView,已经为其定义了自己的itemDelegate。现在,从该委托中,我可以使用styleData.value访问该列的值,但是我还需要访问同一项目中的其他属性,但是我找不到方法。
我需要这样做,因为文本样式需要根据项模型的其他属性进行更改。
有任何想法吗?谢谢!
缺少一些文档。在项目委托中,您可以访问以下内容(取自的源代码TreeView.qml
):
styleData
(请参阅文档)model
(当前未记录)modelData
(当前未记录,对此不确定,但我想它类似于ListView
)(顺便说一下,文档中还缺少什么,但有用的是styleData.role
。此外,其他代表的文档也缺少一些可用的属性;最好是浏览一下QML文件的源代码并查找实例化您的委托的Loader元素。此外,您还将学习令人毛骨悚然的东西的工作原理。
使用model
和行/列信息,然后可以导航到项目数据。此代码取决于模型的类型。
如果您使用的是QML ListModel
,则可以使用model.get
:model.get(styleData.row)[styleData.role]
应该可以正常工作(由于我很少使用,请耐心等待,请提供反馈)。
如果您使用的是C ++ QAbstractItemModel或朋友,最好是在模型类中添加一个仅包含行名和角色名的插槽,因为这是使用的信息TableView
(角色号或列也没有……) 。
但是,在两种情况下,都不应在属性绑定中使用表达式!由于您没有使用属性系统访问数据,因此通知系统将无法正常工作。根据您的问题,我想您想在具有绑定的表达式中使用它。我不知道如何正确地手动听取模型中的更改。
一种替代方法是访问该行的其他项目并在那里提供属性。一些提示:
从一个项目中,您可以通过使对象树上移两次(首先到达实例化您的组件的Loader,然后到达实际行),然后下移两次(首先到达特定的子对象,从而访问同一行的其他项目)加载程序,然后是其实例化的项目)。您需要知道要访问的列号(而不是角色名称),我假设您要访问第一列(索引0):
parent.parent.children[0].item
您可以使用每个项目中的属性来提供模型数据。假设一个简单的Text元素可能是:
Text {
property variant value: styleData.value // <-- Here you make it available
// your other stuff
}
将它们放在一起可能如下所示。在此示例中,我假设第一行包含一个整数,如果为零,则第二列应为红色。
// (within TableView)
itemDelegate: Text {
property variant value: styleData.value
text: styleData.value
color: (styleData.column == 1 && parent.parent.children[0].item.value === 0)
"red" : "black"
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句