使用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?
警告:我还没有实际对此进行测试,以确保它能够与第二个TableView一起使用。 它确实适用于我正在测试的那个。
感谢您的任何想法!
韦恩
更新答案。再次感谢mlvljr,帮助我集思广益。
内联,在TableView级别,我可以使用Loader元素作为一种包装器委托来创建与" real"的松散绑定。代表;如下:
rowDelegate : Loader {
property TableView tableView : itemsAcquiredList
property QtObject styleDataExported: styleData
sourceComponent: tableRowDelegate
}
然后可以使用Loader中定义的那些属性 我的真实"代表。我可以将该块复制粘贴到任何其他块中 TableView,只更改分配给tableView属性的id,以及 然后将它与我的可重用代表一起使用。
事实证明,当我使用加载器来获取我的委托,styleData和 模型不再直接在加载的委托中可用;因此 需要'styleDataExported' Loader中的属性(tableView 属性现在提供对模型的访问)。所以,对于额外的糖衣, 我可以在加载的委托中添加两个属性绑定,如下所示:
property QtObject styleData: styleDataExported
property var model : tableView.model
中提琴!现在,我的代理人的代码看起来就像一个真实的代码,而我 可以从TableView获取所有属性,信号和方法 祖先没有使用过它的' id',而且从未做过任何事情 关于代表内部祖先的假设。
我不太了解装载机,或者我是否会表演 这样做的惩罚,但它确实给了我一个干净的分离和 视图和委托之间的松散绑定。现在,这是 正是我在寻找的东西。
更新II:我已经使用itemDelegate和rowDelegate对此进行了测试, 他们都按预期工作。