Как удалить корневой элемент из 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
Вы достигли корневого индекса.