使用QML,我正在编写一个自定义的itemDelegate和rowDelegate,我希望能够在任意数量的不同TableView实例中使用它 . 正如下面的代码所示,我已经能够实现这一点 - 但只是在某种程度上我非常怀疑它在将来(或之前的,就此而言)Qt版本的工作 . 我目前正在使用Qt 5.2 .

Component {
    id: tableRowDelegate

     Rectangle {
     height: 16
     color: styleData.selected ? "#448" : (styleData.alternate? "#eee" : "#fff")

     property TableView tableView

     // The view is 8 levels up for the rowDelegate
     Component.onCompleted: {
          if (styleData.row > -1)  // Not entirely sure why this is needed -- worse, I don't know why it works; it just does
                tableView = parent.parent.parent.parent.parent.parent.parent.parent
      }

 // Other delegate code omitted for brevity
    }
}

Component {

id: tableCellDelegate

Rectangle {
    width: parent.width
    height: parent.height
    color: "transparent"
    border.color: "#a3b3b3"
    border.width: 1
    radius: 5

    property TableView tableView

    // The View is 9 levels up for the itemDelegate
    Component.onCompleted: {
        tableView = parent.parent.parent.parent.parent.parent.parent.parent.parent
    }

 // Other delegate code omitted for brevity
}

}

一旦构造了这些委托,通过在属性或信号名称前添加“tableView”,访问封闭的TableView是微不足道的(并且是匿名的);即

tableView.alternatingRowColors

. . . 仅举例来说 .

是否真的没有更好的方法从代理中访问视图而不对祖先进行硬编码,如上例所示,或者更糟糕的是:没有明确地硬绑定到TableView的id?

警告:我实际上没有对此进行过测试,以确保测试结果为'll work with a 2nd TableView. It does work with the one I' .

谢谢你的任何想法!

韦恩


更新答案 . 再次感谢mlvljr,帮助我集思广益 .

内联,在TableView级别,我可以使用Loader元素作为包装委托的类型来创建与“真正”委托的松散绑定;如下:

rowDelegate : Loader {
    property TableView tableView        : itemsAcquiredList
    property QtObject  styleDataExported: styleData
    sourceComponent: tableRowDelegate
}

然后,Loader中定义的那些属性可供我的“真实”代表使用 . 我可以将该块复制粘贴到任何其他TableView中,只更改分配给tableView属性的id,然后将其与我的可重用委托一起使用 .

事实证明,当我使用加载器来获取我的委托时,styleData和model不再可以直接在加载的委托中使用;因此需要在Loader中使用'styleDataExported'属性(tableView属性现在提供对模型的访问) . 因此,对于额外的糖涂层,我可以在加载的委托中添加两个属性绑定,如下所示:

property QtObject  styleData: styleDataExported
property var       model    : tableView.model

而且中提琴!现在我的委托代码看起来就像一个真实的代码,我可以从TableView祖先那里获得所有属性,信号和方法,而无需使用它的'id',也无需对委托的内部祖先做任何假设 .

我不太了解加载器,或者我是否会因为这样做而导致性能损失,但它确实给了我一个清晰的分离和视图与委托之间的松散绑定 . 就目前而言,这正是我所寻找的 .

更新II:我用itemDelegate和rowDelegate对它进行了测试,它们都按预期工作 .