LINUX.ORG.RU

[Qt] Увидеть новую ветку в QTreeView

 


0

1

Здравствуйте!

Что-то я как-то неправильно код начал писать, теперь не знаю как разрулить.

У меня есть виджет, на котором лежит дерево QTreeView. К этому дереву подключена модель knowTreeModel (наследник класса QAbstractItemModel).

Мне нужно реализовать добавление подветки (из специального компактного представления) к указанному через QModelIndex элементу. Подветка добавляется последней в список пожветок элемента. Нужно чтобы после добавления добавленная ветка стала видна.

Я использую такой код. На входе переменная TreeItem *item указывает на элемент, к которому надо добавить подветку:

 // Определяется количество подветок у элемента
 int item_rows=item->childCount();
 qDebug() << "paste_branch_smart() : Subbranch count " << item_rows;
 
 // Определяется QModelIndex из TreeItem
 QModelIndex item_index=knowTreeModel->get_index_by_item(item);
 
 // Проверка, правильно ли определен QModelIndex из TreeItem
 int n=knowTreeModel->getItem(item_index)->childCount();
 qDebug() << "paste_branch_smart() : Subbranch count for item by index" << n;
 
 // Модель оповещается что будет добавление подветки
 knowTreeModel->beginInsertRows_middle(item_index, item_rows, item_rows);
 
 
 // Добавляется подветка в Item-представление
 knowTreeModel->paste_subbranch(item, (clipbbranch *)branch);
 
 
 // Модель оповещается, что добавление окончено
 knowTreeModel->endInsertRows_middle();
 
 // Вид обновляется
 knowTree->update();

Код для beginInsertRows_middle() / ndInsertRows_middle() следующий:

void KnowTreeModel::beginInsertRows_middle( const QModelIndex & parent, int first, int last )
{
 beginInsertRows(parent, first, last);
}
 
 
void KnowTreeModel::endInsertRows_middle()
{
 endInsertRows();
}

Отладочный вывод показывает, что используется правильный QModelIndex:

paste_branch_smart() : Subbranch count 17
paste_branch_smart() : Subbranch count for item by index 17

Однако после выполнения этого кода, в Item-представлении новые данные добавляются, а на экране новая подветка не появляется.

Вопрос. Почему так? Что нужно сделать, чтобы увидеть строку с новой подветкой?


beginInsertRows_middle() / ndInsertRows_middle()

Велосипед - оно и для того protected, чтобы использовать внутри модели.

// Определяется QModelIndex из TreeItem

QModelIndex item_index=knowTreeModel->get_index_by_item(item);


// Модель оповещается что будет добавление подветки

knowTreeModel->beginInsertRows_middle(item_index, item_rows, item_rows);


item_index - должен быть индекс parent'а, это так?

UVV ★★★★★
()
Ответ на: комментарий от UVV

> item_index - должен быть индекс parent'а, это так?

Да, это QModelIndex элемента, к которому будет добавлена подветка.

Вот что я еще выяснил. Отрисовка новой ветки нормально происходит, если добавление идет к «обычной» ветке. А если идет добавление к корню, то новую созданную ветку невидно.

Корневой элемент, согласно документации, это элемент, у которого QModelIndex невалидный. Может, в этом дело? Но как же тогда добавлять ветки к корню, чтобы происходило обновление на экране?

xintrea
() автор топика
Ответ на: комментарий от xintrea

Хм... У меня есть одна так называемая Info нода, которая и используется как корневая.

UVV ★★★★★
()
Ответ на: комментарий от xintrea

Точнее, у которого QModelIndex для parent невалидный. У самого корня QModelIndex валидный (коль мне в дебаге показывает, сколько веток в корне есть). Почему тогда при добавлении к корню не происходит отрисовки новой ветки - неясно.

xintrea
() автор топика
Ответ на: комментарий от UVV

> Посмотри на Simple Tree Model example, найдёшь много полезного там.

Да и так уже излазил вдоль и поперек.

xintrea
() автор топика
Ответ на: комментарий от xintrea

Посмотри всё-таки Simple Tree Model. У тебя должен быть указатель на корневую ветку модели. У тебя есть такой?

UVV ★★★★★
()
Ответ на: комментарий от UVV

> Посмотри всё-таки Simple Tree Model. У тебя должен быть указатель на корневую ветку модели. У тебя есть такой?

Конечно.

В общем, я переделал - отказался от beginInsertRows_middle() / ndInsertRows_middle(), сделал paste_subbranch() приватным, добавив в knowTreeModel публичные функции:

[code]// Добавление новой подветки к указанной ветке из буфера обмена
void knowtreemodel::paste_new_child_branch(const QModelIndex &index, clipbbranch *subbranch)
{
// Получение ссылки на Item элемент по QModelIndex
TreeItem *parent=getItem(index);

beginInsertRows(index, parent->childCount(), parent->childCount());
paste_subbranch(parent, (clipbbranch *)subbranch);
endInsertRows();
}


void knowtreemodel::paste_new_sibling_branch(const QModelIndex &index, clipbbranch *subbranch)
{
// Получение ссылки на родительский Item элемент по QModelIndex
TreeItem *current=getItem(index);
TreeItem *parent=current->parent();

beginInsertRows(index.parent(), parent->childCount(), parent->childCount());
paste_subbranch(parent, (clipbbranch *)subbranch);
endInsertRows();
}[/code]

И все заработало. Видимо, между beginInsertRows()/endInsertRows() нельзя делать какие-то действия, м.б. выходить из кода класса, не знаю. Поэтому и глючило с корнем. Код добавления впринципе вообще не изменился.

xintrea
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.