我已经创建了一个基于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
// ...
}
答案 0 :(得分:1)
有点晚了(4年!),但是在经过几天的卡住之后,我发现了一些与这个问题相关的问题!问题主要是基于ListView处理模型的奇怪方式。
在我自己的模型中覆盖rowCount方法后,我遇到了你提到的确切问题。有趣的是,它们永远不会被称为。 ListView实际上从不调用获取rowCount,而是查询cacheBuffer大小的数量(在我的系统上默认为512),这就是为什么它不会注意到项目是否超过cacheBuffer大小或默认值正在使用,它只会注意到它滚动到最后。
虽然这会解决其他一些人的问题,但这不是解决问题的方法。在你的情况下,如果项目不是那么多,我建议调整ListView cacheBuffer大小,并根据需要增加它。请记住,如果您的元素数量众多,则会对性能造成巨大损失。
答案 1 :(得分:0)
ListView仅渲染当前可见的元素以及滚动时显示的预渲染元素。出于性能原因,默认实现不会呈现所有这些实现。对列表大小的任何引用都应该引用模型对象而不是ListView本身。