Счетчик QML ListView равен нулю, и видны только некоторые строки

Я создал модель ListView на основе QAbstractListModel, похожую на эту пример.
Проблема в том, что мой 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
// ...
}

1

Решение

ListView отображает только те элементы, которые в данный момент видны, плюс несколько элементов, которые предварительно отображаются для отображения при прокрутке. Реализация по умолчанию не отображает их все по соображениям производительности. Любые ссылки на размер списка должны ссылаться на объект модели вместо самого ListView.

0

Другие решения

Это немного поздно (4 года!), Но есть кое-что, связанное с этой проблемой, которую я обнаружил после нескольких дней застрять! Проблема главным образом основана на странном способе работы ListView с моделями.

После переопределения метода rowCount в моей собственной модели я столкнулся с проблемой, о которой вы уже упоминали. Самое смешное, что они НИКОГДА не называются. ListView фактически никогда не вызывает для получения rowCount, вместо этого запрашивает сумму в размере cacheBuffer (который по умолчанию равен 512 в моей системе), поэтому он не будет замечать, если элементы больше размера cacheBuffer или значения по умолчанию, которое он использует , он только замечает, что когда прокручивается до конца.


Хотя это поможет пролить свет на некоторые проблемы других людей, это не решение вашей проблемы. В вашем случае, если элементов не так много, я предлагаю настроить размер кэша буферов ListView и увеличить его так, как вам нужно. Просто имейте в виду, что если ваши элементы становятся многочисленными, это может привести к огромным потерям производительности.

0

По вопросам рекламы [email protected]