Russian Qt Forum
Ноябрь 23, 2024, 07:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QAbstractItemModel  (Прочитано 3911 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« : Сентябрь 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???
С чем это может быть связанно?
Записан
Alexandr Az
Гость
« Ответ #1 : Сентябрь 04, 2013, 23:28 »

Да откудаж известно. Может мышка пробежалась, может окно свернул. Другими словами мало данных. Тестовый проект если не лень, посмотрю. Вообще, конечно, модель часто опрашивает некоторые вещи, которые с первого раза логике не поддаются, но creatIndex не замечался в этом.
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #2 : Сентябрь 05, 2013, 12:36 »

Да вот код
Записан
Alexandr Az
Гость
« Ответ #3 : Сентябрь 06, 2013, 14:32 »

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

P.S. как красиво пишется код в начале проекта. А потом как всегда, пошло поехало.....
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Сентябрь 06, 2013, 14:37 »

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

Метод index(), действительно, вызывается по много раз на каждый чих. Предполагается, что у этого метода константная сложность, и константа невелика (для таблицы всё ясно, там константа фиксирована, для дерева константа - это максимальная глубина дерева).
В любом случае, в индексе не должно быть ресурсоемких операций. Вызвали метод, мы как можно скорее вернули индекс. Всё.

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

Но то такое, меня больше интересует другое. Единственное слабое место в древовидной модели для меня в методе parent(), где используется прямой перебор для нахождения позиции дочернего элемента. Есть ли у Вас опыт по использованию древовидных моделей с бОльшой глубиной и большим кол-вом данных? (оставим вопрос зачем view огромная модель за кадром)
« Последнее редактирование: Сентябрь 06, 2013, 16:01 от Alexandr Az » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.101 секунд. Запросов: 23.