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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по TreeView, после удаления потомка все потомки с низу сворачиваются  (Прочитано 4672 раз)
vovan1982
Гость
« : Июнь 16, 2009, 15:32 »

Привет всем.

Вообщем делаю дерево, использую свою модель унаследованную от QAbstractItemModel для вывода дерева использую QTreeView.
Данные беру из таблици в БД, таблица имеет вид (id, parent_id, name).
В принципе всё работает номально но есть следующая проблемма:
Переопределил removeRows вот код
Код
C++ (Qt)
bool SqlTreeModel::removeRows(int row, int count, const QModelIndex &parent)
{
    ItemData *parentItem;
 
    if(itemDataFromIndex(parent)->id == 0)
        return false;
 
    if (!parent.isValid())
        return false;
    else
        parentItem = itemDataFromIndex(parent.parent());
 
    if (row < 0 || row > parentItem->children.count())
        return false;
 
    beginRemoveRows(parent, row, row + count - 1);
 
    for (int i = 0; i < count; ++i) {
        if(!queryDelItem(parentItem->children[row]))
            return false;
        parentItem->children.removeAt(row);
    }
 
    endRemoveRows();
    return true;
}

Вот пример дерева:
<all>
  |
   -----note1
  |          |
  |          n11
  | 
   -----note2
  |          |
  |          n21
  |
   -----note3
             |
             n31
Если удалять note3 то всё идёт нормально, а вот если удалять note1 то все нижестоящие потомки сворачиваются, тоже при удалении note2, note1 без изменений а note3 сворачивается.
Кто нибуть с таким сталкивался, как сделать так чтоб вид дерева после удаления в нём записи не изменялся?
Записан
vdann
Гость
« Ответ #1 : Июнь 17, 2009, 16:32 »

Поясни пожалуйста следующий код =>
Код
C++ (Qt)
    beginRemoveRows(parent, row, row + count - 1);
 
    for (int i = 0; i < count; ++i) {
        if(!queryDelItem(parentItem->children[row]))
            return false;
        parentItem->children.removeAt(row);
    }
 
    endRemoveRows();
.
...желательно каждую строку, особенно после "beginRemoveRows(parent, row, row + count - 1);",
где ты удаляешь строки с текущей (row), по последнюю (row + count - 1)...
Записан
vovan1982
Гость
« Ответ #2 : Июнь 17, 2009, 18:24 »

if(!queryDelItem(parentItem->children[row]))
             return false;

этот кусок удаляет записи напрямую из БД. на него можно не смотреть. Если какуюто запись не удаётся удалить из БД
то удаление из модели прерывается.

parentItem->children.removeAt(row);

а этот удаление из модели. т.к. children у меня это список то после удаления элемента на его место становится сделующий. В результате если повторить эту операцию несколько раз то удалятся несколько подряд стоящих строк, начиная с указанной (Во всяком случае я так понял когда смотрел в ассистанте.)

Вот этот код я брал для примера
Код
C++ (Qt)
bool StringListModel::removeRows(int position, int rows, const QModelIndex &parent)
{
    beginRemoveRows(QModelIndex(), position, position+rows-1);
 
    for (int row = 0; row < rows; ++row) {
        stringList.removeAt(position);
    }
 
    endRemoveRows();
    return true;
}

впринципе у меня всёравно больше одной строки удалятся не будет.

Записан
vdann
Гость
« Ответ #3 : Июнь 17, 2009, 19:16 »

>>к понял когда смотрел в ассистанте.)
>>Вот этот код я брал для примера

с моей точки зрения это не так..
..в этом примере в моделе данных StringListModel непосредственно сами данные хранятся в stringList (т.к. это строки),
а removeRows(int position, int rows, const QModelIndex &parent) удаляет rows строк с позиции position
Записан
mugabe
Гость
« Ответ #4 : Июнь 18, 2009, 07:21 »

if(!queryDelItem(parentItem->children[row]))
             return false;
А тут как минимум ты забываешь выполнить endRemoveRows().
Записан
vovan1982
Гость
« Ответ #5 : Июнь 18, 2009, 09:15 »

с моей точки зрения это не так..
..в этом примере в моделе данных StringListModel непосредственно сами данные хранятся в stringList (т.к. это строки),
а removeRows(int position, int rows, const QModelIndex &parent) удаляет rows строк с позиции position


а как было бы правильней? подскажи если не сложно.

if(!queryDelItem(parentItem->children[row]))
             return false;
А тут как минимум ты забываешь выполнить endRemoveRows().

согласен, не доглядел спасибо, просто у меня ещё небыло ситуаций когдаб это правило срабатывало.
Записан
vovan1982
Гость
« Ответ #6 : Июнь 19, 2009, 10:21 »

Всё заработало.

Полностью переписал модель, за основу взял "examples\itemviews\editabletreemodel".
Точнее сама модель практически не изменилать, за исключением нескольких моментов, а вот класс
TreeItem(класс дерева) изменился полностью.

Так что проблема скорее всего была в кривой реализации класса дерева.

Спасибо всем.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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