1

我创建了一个基于 QAbstractListModel 的 ListView 模型,类似于此示例。问题是我的 ListView 不显示所有行,而只显示那些最初可见的行。所以当我向下滚动(或轻弹)时,只有黑色空间。ListView 有 count == 0 但它应该有 count == 10,因为我添加了 10 个元素。

我的课程包含更新模型 rowCount 的必要方法

// needed as implementation of virtual method
int rowCount(const QModelIndex & parent) const {
    return standings.size();
}
int rowCount() {
    return standings.size();
}

void addStanding(const Standing &st) {
    beginInsertRows(QModelIndex(), rowCount(), rowCount());
    qDebug() << "row cnt: " << rowCount();
    standings << st;
    endInsertRows();
}

我还更新了 ListView 模型

rootContext = (QDeclarativeContext*)(viewer->rootContext());
rootContext->setContextProperty("myModel", &sm);

QML 代码

ListView {
            id: raceList
            objectName: "standingList"
            y: header.height
            width: parent.width
            height: parent.height - header.height
            clip: true
            model: myModel
            delegate: rowComp
        }
        Component {
            id: rowComp
            SessionRowDelegate { }
        }

我还想提一下,这适用于静态模型。 如何让 ListView 一直显示所有项目,而不仅仅是对用户可见?

SessionRowDelegate

Rectangle {
  id: rowbg
  width: parent.width
  height: 34 * (1 + (parent.width - 360) * 0.002)

  // contains other elements with height not exceeding rowbg's height
  // ...
}
4

2 回答 2

1

有点晚了(4 年!),但是在卡住了几天之后,我发现了与这个问题相关的一些东西!问题主要基于 ListView 处理模型的奇怪方式。

在我自己的模型中覆盖 rowCount 方法后,我遇到了您提到的确切问题。有趣的是,他们从来没有被叫过。ListView 实际上从不调用获取 rowCount,而是查询 cacheBuffer 大小的数量(在我的系统上默认为 512),这就是为什么它不会注意到项目是否超过 cacheBuffer 大小或它使用的默认值,它只注意到当它滚动到最后。


虽然这将阐明其他一些人的问题,但它不是您问题的解决方案。在您的情况下,如果项目不是那么多,我建议调整 ListView cacheBuffer 大小,并根据需要增加它。请记住,如果您的元素数量众多,则可能会造成巨大的性能损失。

于 2017-04-04T08:39:28.320 回答
0

ListView 仅呈现当前可见的元素以及一些在滚动时预先呈现以显示的元素。出于性能原因,默认实现不会呈现所有这些。任何对列表大小的引用都应该引用模型对象而不是 ListView 本身。

于 2013-03-19T17:29:52.243 回答