移动行时ListView contentY会发生变化

时间:2015-09-23 14:18:03

标签: qt listview qvector

我有一个ListView分为两个部分:收藏夹和常规项目,其模型继承QAbstractItemModel。对模型中的项目进行排序,使得收藏夹位于常规项目之前,当项目标记为收藏夹时,它将移动到基础列表中的适当位置。

这是模型中执行移动的代码:

if (beginMoveRows(QModelIndex(), position, position, QModelIndex(), newPosition)) {
    items.removeAt(position);
    items.insert(newPosition + (newPosition < position ? 0 : -1), item);
    endMoveRows();
}

但是,每次移动时,ListView的contentY都会被-delegate.height更改(在这种情况下为-120px)。唯一可见的变化是滚动条偏移并最终退出屏幕。

发生了什么以及如何解决?

编辑:我发现只有当ListView完全滚动到底部时才会发生这种情况。

1 个答案:

答案 0 :(得分:0)

这是对问题的间接解决方案。由于唯一重要的症状是滚动条偏移,我必须找到另一个值来设置滚动条的y属性:ListView.visibleArea.yPosition

这是整个绑定:

Binding {
    target: handle
    property: "y"
    value: (flickable.height - handle.height - 25) * flickable.visibleArea.yPosition / (1 - flickable.visibleArea.heightRatio)
}

说明:

  • flickable.height - handle.height - 这是滚动条手柄顶部移动的高度部分
  • 25 - 我自己的特定偏移,与其他人无关
  • flickable.visibleArea.yPosition / (1 - flickable.visibleArea.heightRatio) - 整个数字是从滚动条的最高位置到最低位置(最高y)的0%到100%的百分比

有关ListView.visibleArea.yPosition的更多信息。