Привет всем.
Народ помогите пожалуйста ни как не могу понять в чём проблема.
Ситуация следующая:
Класс дерева TreeItem такой же как в "..\examples\itemviews\editabletreemodel"
модель практически такая же как "..\examples\itemviews\editabletreemodel" но немного переделана, т.к. данные хранятся в MySql.
Есть следующее дерево:
root
|
--Node1
| |
| --n11
| | |
| | --n111
| --n12
--Node2
|
--n21
| |
| --n211
--n22
|
--n221
В результате следующих действи программа вылетает:
1. перемещаю n21 с потомком в Node1
2. перемещаю n22 с потомком в Node1
3. удаляю Node2
4. удаляю n21 (потомок n211 тоже удаляется)
5. удаляю n22 (потомок n221 тоже удаляется)
6. добавляю в root нового потомка Node3
7. удаляю Node3. После этого программа вылетает.
Вот код перемещения в TreeItem:
bool TreeItem::moveTo(int position, TreeItem *newParent)
{
if (position < 0 || position > newParent->children.size())
return false;
int num;
/*получаем номер текуцего потомка в списке потомков родителя*/
num = childNumber();
/*удаляем текущий элемент из списка родителя*/
parentItem->children.removeAt(num);
/*изменяем родителя у текущего элемента*/
parentItem = newParent;
/*добавляем текущий элемент в список нового родителя в указанную позицию*/
newParent->children.insert(position,this);
return true;
}
Вот перемещение в модели:
QModelIndex SqlTreeModel::moveItem(int movedId, int newParentId)
{
QModelIndex indexFrom, indexTo;
QSqlQuery query;
TreeItem *newParent;
TreeItem *item;
newParent = search(rootItemData,newParentId); // поиск нового родителя по id в дереве
item = search(rootItemData,movedId); // поиск перемещаемого элемента по id в дереве
indexTo = indexFromItemData(newParent); // получаем индекс нового родителя
indexFrom = indexFromItemData(item); // получаем индекс перемещаемого элемента
emit layoutAboutToBeChanged();
// если перемещение прошло нормально
if(item->moveTo(newParent->childCount(),newParent)){
changePersistentIndex(indexFrom, index(newParent->childCount()-1,0,indexTo)); // обноляем treeview
}else{
emit layoutChanged();
return indexFrom;
}
emit layoutChanged();
//обновление данных в БД
query.exec(QString("UPDATE %1 SET parent_id = '%2' WHERE id = %3").arg(tabName).arg(newParentId).arg(movedId));
return index(newParent->childCount()-1,0,indexTo); // возвращаем новый индекс перемещаемого элемента
}
если moveItem переделать следующим образом:
QModelIndex SqlTreeModel::moveItem(int movedId, int newParentId)
{
QModelIndex indexFrom, indexTo;
QSqlQuery query;
TreeItem *newParent;
TreeItem *item;
newParent = search(rootItemData,newParentId);
item = search(rootItemData,movedId);
indexTo = indexFromItemData(newParent);
indexFrom = indexFromItemData(item);
if(item->moveTo(newParent->childCount(),newParent))
reset();
query.exec(QString("UPDATE %1 SET parent_id = '%2' WHERE id = %3").arg(tabName).arg(newParentId).arg(movedId));
return index(newParent->childCount()-1,0,indexTo);
}
то всё работает нормально, но после reset() всё дерево сворачивается, а разворачивать дерево после каждого перемещения не очень удобно, да и не правильно.
Всё вопрос снимается.
Сделал иначе, хоть новый вариант мне не сильно нравится, но вариантов больше не осталось и мозги сварились.