如何从QTreeView中删除根元素?

时间:2017-10-26 13:35:08

标签: qt qt4 qstandarditemmodel qstandarditem

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

<!doctype html>
<html lang="en">
  <head>
    <title>Hello, world!</title>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb" crossorigin="anonymous">
  </head>

  <body>
  <div class="container">
      <div class="row">
            <button type="button" class="btn btn-primary">Primary</button>
      </div>
 </div>

    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js" integrity="sha384-vFJXuSJphROIrBnz7yo7oB41mKfc8JzQZiCq4NCceLEaO4IHwicKwpJf9c9IpFgh" crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>
  </body>
</html>

为什么当我尝试删除最后一个元素时,void TreeModel::slotDelete() { QStandardItem *curItem = itemFromIndex(_tvMainTree->currentIndex()); QStandardItem *curParent = itemFromIndex(_tvMainTree->currentIndex())->parent(); if(!curItem || !curParent) return; curParent->removeRow(curItem->row()); } curParent

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

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

2 个答案:

答案 0 :(得分:0)

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

好像您正在使用QStandardItemModel。比较QStandardItemModel::invisibleRootItem()的文档:

  

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

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

答案 1 :(得分: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());
}