crossplatform.ru

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


  Ответ в Перемещение элементов в TreeView
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Vovan Дата 13.7.2009, 12:19
  Всё вопрос снимается.
Сделал иначе, хоть новый вариант мне не сильно нравится, но вариантов больше не осталось и мозги сварились.
Vovan Дата 10.7.2009, 17:23
  Привет всем.
Народ помогите пожалуйста ни как не могу понять в чём проблема.
Ситуация следующая:
Класс дерева 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() всё дерево сворачивается, а разворачивать дерево после каждого перемещения не очень удобно, да и не правильно.
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 11.7.2025, 21:05