【发布时间】:2015-12-14 17:01:46
【问题描述】:
我正在使用TableView 来显示 SQLite 数据库的内容。用户单击其中一个可检查按钮,然后通过LocalStorage API 读取右表。因此,模型总是新的。
因为模型总是新的,新表的加载在视觉上并不吸引人(所有条目都一次显示)。
我的想法是在添加时为行的高度设置动画(以线性方式从 0 开始)
可以在不从头开始重新实现rowDelegate 的情况下做到这一点吗?
【问题讨论】:
我正在使用TableView 来显示 SQLite 数据库的内容。用户单击其中一个可检查按钮,然后通过LocalStorage API 读取右表。因此,模型总是新的。
因为模型总是新的,新表的加载在视觉上并不吸引人(所有条目都一次显示)。
我的想法是在添加时为行的高度设置动画(以线性方式从 0 开始)
可以在不从头开始重新实现rowDelegate 的情况下做到这一点吗?
【问题讨论】:
是的,有可能。
TableView 使用 ListView 作为内部对象。您可以使用属性__listView 访问它。
使用ListView,可以指定当视图中的项目因修改视图模型而发生更改时应应用的转换。
Transition {
id: populateTransition
NumberAnimation { properties: "y"; duration: 300 }
}
TableView {
TableViewColumn {
role: "title"
title: "Title"
width: 100
}
model: libraryModel
Component.onCompleted: {
this.__listView.populate = populateTransition
this.__listView.add = populateTransition
}
}
附:此解决方案依赖于修改内部对象,不能保证跨不同的 Qt 版本或平台工作。
【讨论】:
this.__listView 是否存在以保持故障安全?
__listView 不存在,则可能是undefined 或null。
没有。
这将是令人难以置信的hacky。我想它会是这样的(假设仅 QML):
此时,行项目有可能已经以全高显示,但假设不是这种情况,您需要动态创建一个 NumberAnimation,例如,然后为高度变化。
您最好使用支持转换的ListView 创建自己的TableView。
【讨论】: