来自委托的QML TableView访问模型属性

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)

  • 很高兴我能帮助你!我今天遇到了几乎相同的问题,然后我找到了解决方案,并希望在将来再次需要时将信息分享并保存在安全的地方.;)如果有什么不起作用,请告诉我,以便我能纠正它并从中获利!:) (2认同)

Ngọ*_* Đỗ 5

我认为,如果您阅读 TableViewItemDelegateLoader.qml 的源代码(它是 中的私有代码qtquickcontrol) ,则很容易
访问您使用的任何角色,请使用 : model[your_role_name]

对于经验: model["comment"]