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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Перемещение элементов в TreeView  (Прочитано 3891 раз)
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() всё дерево сворачивается, а разворачивать дерево после каждого перемещения не очень удобно, да и не правильно.
Записан
vovan1982
Гость
« Ответ #1 : Июль 13, 2009, 12:17 »

Всё вопрос снимается.
Сделал иначе, хоть новый вариант мне не сильно нравится, но вариантов больше не осталось и мозги сварились.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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