使用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对它进行了测试,它们都按预期工作 .