QML:如何将模型属性传递给GridView(或ListView)代理中加载的委托?

前端之家收集整理的这篇文章主要介绍了QML:如何将模型属性传递给GridView(或ListView)代理中加载的委托?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试构建一个内部托管GridView的可重用的QML组件. GridView中的每个元素都具有一组在整个应用程序中很常见的行为(主要是显示和基于鼠标的东西).但是,GridView元素中显示内容会根据用例而有所不同. (也就是说,一个GridView的封装组件相同,但应用程序的其他部分可能使用不同的组件.)

所以,我想做的是每个调用都提供一个代理,它被添加到已经是委托的GridView中的每个元素.换句话说,这样的东西:

MyGrid.qml

  1. import QtQuick 1.1
  2.  
  3. Rectangle {
  4. id: myGrid
  5. objectName: "myGrid"
  6.  
  7. property Component internalDelegate
  8. property variant internalModel
  9.  
  10. GridView {
  11. anchors.fill: parent
  12.  
  13. delegate: Row {
  14. Loader {
  15. sourceComponent: myGrid.internalDelegate
  16. }
  17. }
  18.  
  19. model: parent.internalModel
  20. }
  21. }

这个想法是,GridView代理中的Loader加载了用户提供的委托,它将如下所示:

Main.qml

  1. import QtQuick 1.1
  2.  
  3. Rectangle {
  4. anchors.fill: parent
  5.  
  6. width: 300
  7. height: 200
  8.  
  9. MyGrid {
  10. anchors.fill: parent
  11.  
  12. internalDelegate: Text {
  13. text: name
  14. }
  15.  
  16. internalModel: ListModel {
  17. ListElement {
  18. name: "a"
  19. }
  20.  
  21. ListElement {
  22. name: "b"
  23. }
  24. }
  25. }
  26. }

但是,这不行. QML报告“名称”是Text元素中的未知变量.如果我用一个字符串(即“你好”)替换名称变量,它的工作原理就如预期的那样.

我的问题是,如何将“名称”变量传递给internalDelegate,或者更好的是使整个模型可用,因此internalDelegate可以访问它们(因为调用者也正在定义模型).

另一个问题是:有更好的方法吗?

解决方法

我这样解决了:

MyGrid.qml

  1. import QtQuick 1.1
  2.  
  3. Rectangle {
  4. id: myGrid
  5. objectName: "myGrid"
  6.  
  7. property Component internalDelegate
  8. property variant internalModel
  9.  
  10. GridView {
  11. id: grid
  12. anchors.fill: parent
  13.  
  14. delegate: Row {
  15. Loader {
  16. sourceComponent: myGrid.internalDelegate
  17. property variant modelData: grid.model.get(index)
  18. }
  19. }
  20.  
  21. model: parent.internalModel
  22. }
  23. }

main.qml
导入QtQuick 1.1

  1. Rectangle {
  2. anchors.fill: parent
  3.  
  4. width: 300
  5. height: 200
  6.  
  7. MyGrid {
  8. anchors.fill: parent
  9.  
  10. internalDelegate: Text {
  11. text: modelData.name
  12. }
  13.  
  14. internalModel: ListModel {
  15. ListElement {
  16. name: "a"
  17. }
  18.  
  19. ListElement {
  20. name: "b"
  21. }
  22. }
  23. }
  24. }

不知道是否“更好”,但代码越来越简单.列表模型在QML中有点尴尬,并不一致.请记住,model.get(index)由GridView拥有,因为整个模型都是由它拥有的.所以如果你想在列表被破坏后使用该对象,你必须重新显示或复制它.

猜你在找的Android相关文章