QTreeWidget 插入子节点,删除父节点

该博客介绍了如何在Qt环境中使用QTreeWidgetItem构建数据分类树。首先,初始化四个一级节点,然后遍历数据,根据数据类型将子节点添加到相应的父节点下。最后,以反向遍历的方式删除没有子节点的父节点,确保在删除过程中不会引起索引错误。博客中强调了删除无子节点父节点时需注意的顺序问题。
摘要由CSDN通过智能技术生成

场景:规定了几个父节点,来了一批新数据,按照他们的分类插入到父节点中,删除没有子节点的父节点。

插入一级节点

void _FillDatasetTree()
{
	 ui.treeWidget->clear();
	 QStringList datasetTypes;
	 datasetTypes << QString(QStringLiteral("一"))<< QString(QStringLiteral("二"))
	     << QString(QStringLiteral("三"))<< QString(QStringLiteral("四"))
	//分为四个大类
	for (auto &it : datasetTypes)
    {
        QTreeWidgetItem* pItem = new QTreeWidgetItem(NULL);
        pItem->setText(0, it);
     }
     ui.treeWidget->addTopLevelItem(pItem);
}

这是是初始化大类别,在treeWidget把根节点挂上
然后把子节点挂上

void setChild(std::list<std::map<sting,string>> messages)
{
 	_FillDatasetTree();//先把父节点挂上
    //找到父节点与父节点对应的index
    std::map<QString, int> nameToIndex;
    for (int i = 0; i < ui.treeWidget->topLevelItemCount(); i++)
    {
        QTreeWidgetItem* item = ui.treeWidget->topLevelItem(i);
        QString itemText = item->text(0);
        nameToIndex[itemText] = i;
    }
    //把子节点挂上去
	for(auto it = messages.begin();it!=messages.end();it++){
		cout<<*it<<" ";
		QTreeWidgetItem* ChildItem = new QTreeWidgetItem(NULL);
		int fatherItemIndex = nameToIndex[*it["datasetType"]];//根据子节点datasetType信息 找到父节点对应的index
		ui.treeWidget->topLevelItem(fatherItemIndex)->addChild(ChildItem);
	}
	//删除没有子节点的父节点
	    for (int i = ui.treeWidget->topLevelItemCount()-1; i >-1 ; i--)//必须倒叙
    {
        //QTreeWidgetItem* item = ui.treeWidget->topLevelItem(i);
        if (ui.treeWidget->topLevelItem(i)->childCount() < 1)
            delete ui.treeWidget->topLevelItem(i);
           // ui.treeWidget->removeItemWidget(ui.treeWidget->topLevelItem(i),0);
    } 
}

删除没有子节点的父节点的坑

  1. 必须从后往前删,不然前面的删除了,index就变了!!
  2. 用removeItemWidget 和 delete item 都不好使
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值