Russian Qt Forum

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



Название: Вопрос по TreeView, после удаления потомка все потомки с низу сворачиваются
Отправлено: 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 сворачивается.
Кто нибуть с таким сталкивался, как сделать так чтоб вид дерева после удаления в нём записи не изменялся?


Название: Re: Вопрос по TreeView, после удаления потомка все потомки с низу сворачиваются
Отправлено: vdann от Июнь 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)...


Название: Re: Вопрос по TreeView, после удаления потомка все потомки с низу сворачиваются
Отправлено: vovan1982 от Июнь 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;
}

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



Название: Re: Вопрос по TreeView, после удаления потомка все потомки с низу сворачиваются
Отправлено: vdann от Июнь 17, 2009, 19:16
>>к понял когда смотрел в ассистанте.)
>>Вот этот код я брал для примера

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


Название: Re: Вопрос по TreeView, после удаления потомка все потомки с низу сворачиваются
Отправлено: mugabe от Июнь 18, 2009, 07:21
if(!queryDelItem(parentItem->children[row]))
             return false;
А тут как минимум ты забываешь выполнить endRemoveRows().


Название: Re: Вопрос по TreeView, после удаления потомка все потомки с низу сворачиваются
Отправлено: vovan1982 от Июнь 18, 2009, 09:15
с моей точки зрения это не так..
..в этом примере в моделе данных StringListModel непосредственно сами данные хранятся в stringList (т.к. это строки),
а removeRows(int position, int rows, const QModelIndex &parent) удаляет rows строк с позиции position


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

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

согласен, не доглядел спасибо, просто у меня ещё небыло ситуаций когдаб это правило срабатывало.


Название: Re: Вопрос по TreeView, после удаления потомка все потомки с низу сворачиваются
Отправлено: vovan1982 от Июнь 19, 2009, 10:21
Всё заработало.

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

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

Спасибо всем.