如何从 QTreeView 中删除根元素?
How to remove the root element from QTreeView?
我处理槽中树元素的移除。所有元素都被删除,除了最后一个(根)。
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()的根元素建树。
告诉我如何删除最后一个(根)元素?
根据定义,根项目是层次结构的顶部;它不能有 parent。所以你尝试的是无效的。
您似乎在使用 QStandardItemModel
。比较QStandardItemModel::invisibleRootItem()
的文档:
The invisible root item provides access to the model's top-level items [...] Calling index() on the QStandardItem object retrieved from this function is not valid.
换句话说:根 item/index 是隐式创建的;你不能删除它,此时必须停止递归。顺便说一句,这是使用 Qt 模型时的常见模式:如果 parent()
returns nullptr
你已经到达了根索引。
感谢大家。这是解决方案。
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());
}
我处理槽中树元素的移除。所有元素都被删除,除了最后一个(根)。
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()的根元素建树。
告诉我如何删除最后一个(根)元素?
根据定义,根项目是层次结构的顶部;它不能有 parent。所以你尝试的是无效的。
您似乎在使用 QStandardItemModel
。比较QStandardItemModel::invisibleRootItem()
的文档:
The invisible root item provides access to the model's top-level items [...] Calling index() on the QStandardItem object retrieved from this function is not valid.
换句话说:根 item/index 是隐式创建的;你不能删除它,此时必须停止递归。顺便说一句,这是使用 Qt 模型时的常见模式:如果 parent()
returns nullptr
你已经到达了根索引。
感谢大家。这是解决方案。
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());
}