Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Urvin от Октябрь 29, 2010, 21:10



Название: О добавлении элементов в модель
Отправлено: Urvin от Октябрь 29, 2010, 21:10
Помогите, пожалуйста разобраться с добавлением новых элементов в модель.

Для простого случая с QAbstractTableModel я делаю так:
Код
C++ (Qt)
void tUMCLientsTableModel::ShoutAddNewClient(tUMDCClientInfo aNewClient)
{
   beginInsertRows(QModelIndex(), fClientList.fClientList.count(), fClientList.fClientList.count());
   fClientList.append(aNewClient);
   endInsertRows();
}
Т.е. просто вставляю в список новый объект, используя insertRows. Дальнейшей сортировкой и отображением соответвенно занимаются прокси-модель и комбобокс.

Теперть то же самое мне надо сотворить с моделью дерева QAbstractItemModel. Она построена по методу Бланшета-Саммерфельда, т.е. имеем класс узла дерева со ссылками на детей и родителя, имеем "нулевой" родительский узел - объект класса же узла. Фактически не пользуемся QModelIndex.

Код
C++ (Qt)
RootNode - не отображаемо
--Node1
----Node1.1
----Node1.2
--Node2
--Node3

В текущей ситуации для добавления нового элемента используется такая конструкция:
Код
C++ (Qt)
void tUMClientsModel::AddNewClient(tUMDCClientInfo &aNewClient, bool aUseBeginInsert)
{
   if (aNewClient.fClientParentID == 0)
       fRootNode->fChildrenList.append(new tUMClientsNode(fRootNode, aNewClient));
   else
       for (int i = 0; i < fRootNode->fChildrenList.count(); i++)
           if (fRootNode->fChildrenList[i]->fClientInfo.fClientID == aNewClient.fClientParentID)
           {
               fRootNode->fChildrenList[i]->fChildrenList.append(
                       new tUMClientsNode(fRootNode->fChildrenList[i], aNewClient)
                       );
               break;
           }
}
У класса объекта есть поле индекса и поле индекса родителя. При добавлении проверяется соответствие индекса родителя и индекса каждого из текущих узлов.
Для команды beginInsertRows нам необходимо знать QModelIndex узла, в который мы добавляем новый элемент.

Как узнать его для моего класса узла tUMClientsNode - "нулевого" родительского или какого-то иного?

Для обратного преобразования внутри модели используется
Код
C++ (Qt)
tUMClientsNode *lNode = static_cast<tUMClientsNode*>(aParent.internalPointer());

Спасибо!