QML ListView计数为零,只有一些行可见

时间:2012-12-06 16:33:09

标签: c++ qt listview symbian qml

我已经创建了一个基于QAbstractListModel的ListView模型,类似于这个example。 问题是我的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
  // ...
}

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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