LINUX.ORG.RU

[Qt] Тонкости InterView

 


0

0

Здравствуйте!


Всем нам известен режим связывания модели и представления, который в Qt называется InterView. В SDK есть готовые примеры. И что-то я не могу понять одной вещи.

Есть два метода (можно посмотреть в примере):

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(). Например так:

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, как положено в любом нормальном коде.


Невалидный итем - это и есть корень всей модели. Вы сказали ему, что у корня 0 детей, вот он и показал вам дырку от бублика. Такая логика Qt Model View. Ну это вы и сами уже поняли.

Внутреннюю структуру данных модели определяет её разработчик. Не хотите хранить список корневых детей в каком-то корневом итеме - храните их в списке, и внутри rowCount() если передали невалидный индекс - возвращайте размер этого списка.

Dendy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.