0

我处理插槽中树元素的删除。所有元素都被删除,除了最后一个(根)。

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

 if(!curItem || !curParent) return;

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

为什么当我尝试删除最后一个元素时,curParent0x0

规范:我使用 invisibleRootItem() 的根元素构建树。

告诉我如何删除最后一个(根)元素?

4

2 回答 2

0

根据定义,根项是层次结构的顶部;它不能有父母。所以你正在尝试的是无效的。

好像你正在使用QStandardItemModel. 比较以下文档QStandardItemModel::invisibleRootItem()

不可见的根项目提供对模型顶级项目的访问 [...] 对从此函数检索的 QStandardItem 对象调用 index() 无效。

换句话说:根项/索引是隐式创建的;您不能删除它,此时必须停止递归。这是使用 Qt 模型时的常见模式:如果parent()返回nullptr,您已经到达根索引。

于 2017-10-26T13:51:42.917 回答
0

谢谢大家。这是解决方案。

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());
}
于 2017-10-27T08:15:35.043 回答