Bootstrap

QTreeWidget遍历所有子节点以及删除整个TreeWidget

1. QTreeWidget删除整个TreeWidget

使用递归方式来删除节点下的子节点。分析:如果当前节点没有子节点那么就直接删除,如果有子节点就进入子节点继续删除(这里采用递归形式)直到最低层的节点(没有子节点)返回。然后逐一一层一层的返回实现递归删除。

说明:这里利用了第一个节点删除后下一个节点自动的会成为第一个节点特性。循环删除第一个节点从而实现删除所有节点的目的。

//递归删除节点
void MainWindow::removeItem(QTreeWidgetItem *item)
{
    int count = item->childCount();
    if(count == 0)//没有子节点,直接删除
    {
        delete item;
        return;
    }

    for(int i=0; i<count; i++)
    {
        QTreeWidgetItem *childItem = item->child(0);//删除子节点
        removeItem(childItem);
    }
    delete item;//最后将自己删除

}

/**
 * @brief MainWindow::removeAll_treeWidgetItemv
 * 功能:删除QTreeWidget中所有节点
 */
void MainWindow::removeAll_treeWidgetItemv(void)
{
    //通过删除根节点及其子节点来达到删除整个TreeWidget的目的
    QTreeWidgetItem *item;
    item = ui->josn_treeWidget->topLevelItem(0);
    while(item)
    {
         removeItem(item);
         item = ui->josn_treeWidget->topLevelItem(0);
    }
}

2. QTreeWidget遍历当前节点的所有子节点

说明:这里使用了QTreeWidget迭代器遍历整个TreeWidget控件,然后再判断具有相同父节点的节点。如果节点的父节点(一直往上找,可能是父节点的父节点)相同表示是同一个父节点下的子节点(不一定是同一级的节点)。

/**
  * 功能:查找当前节点下所有子节点
  * 返回值:返回
  **/
int myjosn_string::FindALL_childrenNode(QTreeWidgetItem *item)
{
    if(item->childCount() == 0) //说明:当Item下没有子节点时会导致程序崩溃
    {
        return 0;
    }
    //使用QTreeWidgetItem迭代器从当前节点遍历整个QTreeWidget树
    //判断条件:判断每个QTreeWidgetItem的parent是不是当前节点,如果是表示当前遍历的节点为此节点的子节点
    //否则就不是则停止遍历。此处已经是当前节点的最后一个子节点了
    QTreeWidgetItemIterator ite_item(item); //迭代器的参数应该为全局变量才行
    int all_children_count = 0;
    //节点没有父节点时,返回NULL
    QTreeWidgetItem *temp_item;
    ite_item++;
    temp_item = (*ite_item)->parent();

    qDebug() << "当前节点" << item->childCount();

    if(item->childCount() != 0)
    {
        while((*ite_item))
        {
            while(temp_item)	//筛选具有相同父节点的节点
            {
                if(temp_item != item)
                {
                    return (all_children_count);  //找到了当前节点的结束位置
                }
                else
                {
                    break;  //属于当前节点的子节点
                }
                temp_item = temp_item->parent();
            }
            all_children_count++;
            ite_item++;
        }
    }
    qDebug() << "所有的子节点:" << all_children_count - 1;
    return (all_children_count - 1);   //返回获取到的子节点数量,去除"当前节点本身"
}

 

;