Russian Qt Forum

Qt => Model-View (MV) => Тема начата: demaker от Сентябрь 04, 2013, 11:08



Название: QAbstractItemModel
Отправлено: demaker от Сентябрь 04, 2013, 11:08
Пытаюсь понять как работает QAbstractItemModel
Создаю общий абстрактный класс
от него идут элементы типа база, станция

Запихиваю в базу две станции.
Код
C++ (Qt)
 
class CommonElement: public QObject
{
public:
   explicit CommonElement(QObject*parent = 0);
   virtual void func() = 0;
 
};
 
void Base::func()
{
   qDebug()<<"base";
}
 
void Station::func()
{
   qDebug()<<"station";
}
//----------------------------------------------------------------------------------------
ModelIndex ObjectBrowserModel::index(int row, int column, const QModelIndex &parent) const
{
   if(!hasIndex(row,column,parent))
       return QModelIndex();
 
   CommonElement *parentObj;
   if(!parent.isValid())
   {
       parentObj = base;
   }
   else
   {
       parentObj = reinterpret_cast<CommonElement*>(parent.internalPointer());
   }
 
   parentObj->func();
 
   QObject *obj = parentObj->children().at(row);
   return createIndex(row,column,obj);
}
 
//-------------------------------------------------------------
   Base*base = new Base;
 
   Station *st1 = new Station(base);
   base->stationList.append(st1);
   Station *st2 = new Station(base);
   base->stationList.append(st2);
 
 
Не могу понять почему в консоль выводится 8-раз base???
С чем это может быть связанно?


Название: Re: QAbstractItemModel
Отправлено: Alexandr Az от Сентябрь 04, 2013, 23:28
Да откудаж известно. Может мышка пробежалась, может окно свернул. Другими словами мало данных. Тестовый проект если не лень, посмотрю. Вообще, конечно, модель часто опрашивает некоторые вещи, которые с первого раза логике не поддаются, но creatIndex не замечался в этом.


Название: Re: QAbstractItemModel
Отправлено: demaker от Сентябрь 05, 2013, 12:36
Да вот код


Название: Re: QAbstractItemModel
Отправлено: Alexandr Az от Сентябрь 06, 2013, 14:32
Повезло тебе, только 8 раз, я даже не сосчитал. Я тут с сам с собой посовещался и пришёл в выводу, надо закомментировать строку qDebug()<<"base", тогда проблема исчезнет. А если серьезно, то неизвестно, судя по стеку вызывает его view, так что будем думать он знает что делать. Модель составлена классически и правильно, ресурсоемкие операции отсутствуют в данном методе, пусть себе вызывает сколько ему хочется. Свернуть - развернуть окно, тоже вызывает. Так что это нормально.

P.S. как красиво пишется код в начале проекта. А потом как всегда, пошло поехало.....


Название: Re: QAbstractItemModel
Отправлено: Авварон от Сентябрь 06, 2013, 14:37
Метод index(), действительно, вызывается по много раз на каждый чих. Предполагается, что у этого метода константная сложность, и константа невелика (для таблицы всё ясно, там константа фиксирована, для дерева константа - это максимальная глубина дерева).
В любом случае, в индексе не должно быть ресурсоемких операций. Вызвали метод, мы как можно скорее вернули индекс. Всё.


Название: Re: QAbstractItemModel
Отправлено: Alexandr Az от Сентябрь 06, 2013, 15:59
Метод index(), действительно, вызывается по много раз на каждый чих. Предполагается, что у этого метода константная сложность, и константа невелика (для таблицы всё ясно, там константа фиксирована, для дерева константа - это максимальная глубина дерева).
В любом случае, в индексе не должно быть ресурсоемких операций. Вызвали метод, мы как можно скорее вернули индекс. Всё.

Я не увидел в модели увеличение для данного метода в зависимости от глубины дерева, возможно, Вы имели в виду "рекусивный" вызов до текущего индекса.

Но то такое, меня больше интересует другое. Единственное слабое место в древовидной модели для меня в методе parent(), где используется прямой перебор для нахождения позиции дочернего элемента. Есть ли у Вас опыт по использованию древовидных моделей с бОльшой глубиной и большим кол-вом данных? (оставим вопрос зачем view огромная модель за кадром)