场景:规定了几个父节点,来了一批新数据,按照他们的分类插入到父节点中,删除没有子节点的父节点。
插入一级节点
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);
}
}
删除没有子节点的父节点的坑
- 必须从后往前删,不然前面的删除了,index就变了!!
- 用removeItemWidget 和 delete item 都不好使