Как удалить корневой элемент из QTreeView?

Я обрабатываю удаление элементов дерева в слоте. Все элементы удаляются, кроме последнего (root).

void TreeModel::slotDelete()
{
 QStandardItem *curItem = itemFromIndex(_tvMainTree->currentIndex());
 QStandardItem *curParent = itemFromIndex(_tvMainTree->currentIndex())->parent();

 if(!curItem || !curParent) return;

 curParent->removeRow(curItem->row());
}

Почему когда я пытаюсь удалить последний элемент, curParent является 0x0?

Спецификация: я строю дерево, используя корневой элемент invisibleRootItem ().

Подскажите, как удалить последний (корневой) элемент?

2 ответа

Решение

Спасибо всем. Вот решение.

void TreeModel::slotDelete()
{
 QStandardItem *curItem = itemFromIndex(_tvMainTree->currentIndex());
 if(!curItem) return;

 QStandardItem *curParent = curItem->parent();
 if(!curParent)
 {
  invisibleRootItem()->removeRow(curItem->row());
  return;
 }

 curParent->removeRow(curItem->row());
}

По определению корневой элемент является вершиной иерархии; у него не может быть родителя. Так что то, что вы пытаетесь, неверно.

Похоже, вы используете QStandardItemModel, Сравните документацию QStandardItemModel::invisibleRootItem():

Невидимый корневой элемент обеспечивает доступ к элементам верхнего уровня модели [...]. Вызов index() для объекта QStandardItem, полученного из этой функции, недопустим.

Другими словами: корневой элемент / индекс создается неявно; Вы не можете удалить его и должны остановить рекурсию на этом этапе. Кстати, это обычная картина при использовании моделей Qt: Если parent() возвращается nullptr Вы достигли корневого индекса.

Другие вопросы по тегам