使用 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
}
Run Code Online (Sandbox Code Playgroud)
}
一旦构造了这些委托,就可以通过在属性或信号名称前加上“tableView”来访问封闭的 TableView。IE
tableView.alternatingRowColors
Run Code Online (Sandbox Code Playgroud)
. . . 只是举例。
真的没有更好的方法来从委托中访问视图而不对祖先进行硬编码,如上面的例子,或者更糟:没有明确地硬绑定到 TableView 的 id?
警告:我还没有实际测试过它以确保它可以与第二个 TableView 一起使用。它确实适用于我正在测试的那个。
感谢您的任何想法!
韦恩
更新答案。再次感谢 mlvljr 帮助我进行头脑风暴。
内联,在 TableView 级别,我可以使用 Loader 元素作为一种包装委托来创建与“真实”委托的松散绑定;如下:
rowDelegate : Loader {
property TableView tableView : itemsAcquiredList
property QtObject styleDataExported: styleData
sourceComponent: tableRowDelegate
}
Run Code Online (Sandbox Code Playgroud)
然后,加载器中定义的那些属性可用于我的“真实”委托。我可以只将该块复制粘贴到任何其他 TableView 中,只更改分配给 tableView 属性的 id,然后将其与我的可重用委托一起使用。
事实证明,当我使用加载器获取我的委托时,样式数据和模型不再直接在加载的委托中可用;因此需要加载器中的“styleDataExported”属性(tableView 属性现在提供对模型的访问)。因此,对于额外的糖衣,我可以在加载的委托中添加两个属性绑定,如下所示:
property QtObject styleData: styleDataExported
property var model : tableView.model
Run Code Online (Sandbox Code Playgroud)
还有中提琴!现在我的委托的代码看起来就像一个真实的代码,我可以从 TableView 祖先中获取所有属性、信号和方法,而无需使用其“id”,也无需对委托的内部祖先做出任何假设。
我不太了解加载程序,或者我是否会因为这样做而导致性能损失,但它确实让我在视图和委托之间实现了清晰的分离和松散绑定。目前,这正是我正在寻找的。
更新 II:我已经使用 itemDelegate 和 rowDelegate 对此进行了测试,它们都按预期工作。