Привет.
Есть список некоторых данных, скажем 100. Данные отображаются в 2-х tableView, в одном все, в другом только последняя строка. Когда приходит новая порция, то старые с начала списка выбрасываются, а новые пишутся в конец.
Теперь такой нюанс, у первого View есть кнопка freeze, т.е. данные должны замереть. Во втором же view так и должны проскакивать новые. Чтобы это решить, я сделал атрибут visible в данных, а для первой view использую FilterModel, в которой фильтрую те, которые не должны быть видны, пока freeze активна.
Когда убираешь freeze, то новым делается setVisible(true).
Вопросы вот в чём.
- Чтобы иметь какой-то буфер, я установил количество видимых элементво в уже упомянутые 100, а верхнуюю границу контейнера (т.е. когда старые нужно выбрасывать) в два раза больше. Нормальный ли подход или как-нибудь по-другому посоветуете?
- В данной реализации фильтр работает так:
bool FilterModel::filterAcceptsRow
(int source_row, const QModelIndex & source_parent) const
{
QModelIndex source_index =
sourceModel()->index(source_row, filterKeyColumn(), source_parent);
return sourceModel()->data(source_index, MyModel::VisibilityRole).toBool();
}
Почему-то, когда в модели делаю emit dataChanged(), т.е. хочу, чтобы те, которые были невидимы, отобразились - не работает. Приходится делать filterModel->invalidate(); отбой dataChanged() нормально работает, ошибку нашёл =)