crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Перемещение элементов в TreeView
Гость_Vovan_*
сообщение 10.7.2009, 17:23
Сообщение #1





Гости








    


Привет всем.
Народ помогите пожалуйста ни как не могу понять в чём проблема.
Ситуация следующая:
Класс дерева 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() всё дерево сворачивается, а разворачивать дерево после каждого перемещения не очень удобно, да и не правильно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Vovan_*
сообщение 13.7.2009, 12:19
Сообщение #2





Гости








    


Всё вопрос снимается.
Сделал иначе, хоть новый вариант мне не сильно нравится, но вариантов больше не осталось и мозги сварились.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2021, 21:30