Здравствуйте!
Всем нам известен режим связывания модели и представления, который в Qt называется InterView. В SDK есть готовые примеры. И что-то я не могу понять одной вещи.
Есть два метода (можно посмотреть в примере):
C++ (Qt)
int TreeModel::rowCount(const QModelIndex &parent) const
{
TreeItem *parentItem = getItem(parent);
return parentItem->childCount();
}
TreeItem *TreeModel::getItem(const QModelIndex &index) const
{
if (index.isValid()) {
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
if (item) return item;
}
return rootItem;
}
Так вот, в rowCount() нет проверки на валидность индекса. В результате, даже если индекс невалидный, из rowCount() идет тупо вызов getItem().
В getItem() в случае невалидного индекса возвращается rootItem (!) - зачем??
Но самое интересное возникает тогда, когда пытаешься добавить проверку валидности в rowCount(). Например так:
C++ (Qt)
int TreeModel::rowCount(const QModelIndex &parent) const
{
if(parent.isValid()) {
TreeItem *item = getItem(parent);
return item->childCount();
}
else return 0;
}
После такого исправления, дерево перестает отображаться вообще. Дебаг показал, что это происходит из-за того, что представление запрашивает количество строк в корне дерева путем запрашивания у модели метода rowCount(), передавая ему невалидный индекс (!) . И ожидает, что если индекс невалидный, то будет возвращено количество строк корневого элемента (а не 0). Зачем так??
Я хотел переделать getItem() таким образом, чтобы он возвращал NULL а не rootItem в случае невалидного индекса. Но оказывается, это сделать нельзя по вышеописанной причине.
Вопрос - почему так сделано, и есть ли какой-нибудь способ правильно работать с невалидными индексами? То есть не возвращать rootItem в случае невалидного индекса, а возвращать NULL, как положено в любом нормальном коде.