Russian Qt Forum

Qt => Model-View (MV) => Тема начата: vovan1982 от Июль 10, 2009, 16:34



Название: Перемещение элементов в TreeView
Отправлено: vovan1982 от Июль 10, 2009, 16:34
Привет всем.
Народ помогите пожалуйста ни как не могу понять в чём проблема.
Ситуация следующая:
Класс дерева 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() всё дерево сворачивается, а разворачивать дерево после каждого перемещения не очень удобно, да и не правильно.


Название: Re: Перемещение элементов в TreeView
Отправлено: vovan1982 от Июль 13, 2009, 12:17
Всё вопрос снимается.
Сделал иначе, хоть новый вариант мне не сильно нравится, но вариантов больше не осталось и мозги сварились.