Pab*_*ote 7 qt qml qt-quick qtquick2 qtquickcontrols
我有一个TableView,我已经定义了自己的itemDelegate.现在,从这个委托中我可以使用styleData.value访问列的值,但是我还需要访问同一个项目中的其他属性,但我找不到如何操作.
我需要这个,因为文本样式需要根据项目模型的其他属性进行更改.
有任何想法吗?谢谢!
lee*_*mes 15
缺少一些文档.在项目委托中,您可以访问以下内容(取自源代码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,然后到实际行)然后向下两次(首先到特定的子对象,这是一个Loader,然后是它实例化的项目).您需要知道要访问的列号(而不是角色名称),我假设您要访问第一列(索引0):
parent.parent.children[0].item
Run Code Online (Sandbox Code Playgroud)您可以使用每个项目中的属性提供模型数据.假设一个简单的Text元素,这可能是:
Text {
property variant value: styleData.value // <-- Here you make it available
// your other stuff
}
Run Code Online (Sandbox Code Playgroud)将它们放在一起可能如下所示.在这个例子中,我假设第一行包含一个整数,如果它是零,则第二列应该是红色.
// (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"
}
Run Code Online (Sandbox Code Playgroud)
我认为,如果您阅读 TableViewItemDelegateLoader.qml 的源代码(它是 中的私有代码qtquickcontrol)
,则很容易
访问您使用的任何角色,请使用 : model[your_role_name]。
对于经验: model["comment"]
| 归档时间: |
|
| 查看次数: |
12321 次 |
| 最近记录: |