点击两个删除按钮后
创建父节点,子节点的语法就不再阐述
//创建item 根节点root
void ScreenWnd::creatItem(const QString &type, const QString &name)
{
//查找表中 根节点是否存在 匹配根节点 名字 匹配标志 列
QList<QTreeWidgetItem *> rootItems = treeWidget->findItems(type, Qt::MatchContains, 0);
if(rootItems.isEmpty())
{ //根节点不存在 创建根节点
QTreeWidgetItem *topItem = new QTreeWidgetItem(treeWidget);
topItem->setText(0, type);
topItem->setCheckState(0, Qt::Checked); //勾选框
treeWidget->addTopLevelItem(topItem); //顶端的节点
// 编辑和删除按钮 设置图片大小 按钮背景透明 放入二三列
QPushButton *topEditBtn = new QPushButton(this);
QPushButton *topDeleteBtn = new QPushButton(this);
topEditBtn->setIcon(QIcon(":/res/edit.png"));
topEditBtn->setIconSize(QSize(30, 30));
topDeleteBtn->setIcon(QIcon(":/res/delete.png"));
topDeleteBtn->setIconSize(QSize(30, 30));
topEditBtn->setStyleSheet("background-color:transparent");
topDeleteBtn->setStyleSheet("background-color:transparent");
treeWidget->setItemWidget(topItem, 1, topEditBtn); //顶层
treeWidget->setItemWidget(topItem, 2, topDeleteBtn); //顶层
rootItemMap.insert(type, topItem); //map存放根节点
connect(topDeleteBtn, &QPushButton::clicked, this, [=]()
{
removeMultipleRow(); //点击根节点同一行的删除按钮 删除选中子节点
});
}
}
当点击根节点的时候,判断根节点的复选框状态
如果为半选状态 删除此根节点下已经勾选的子节点
如果为全选状态 删除此根节点下所有的子节点 并包含此根节点
//父节点删除按钮 删除多行
void ScreenWnd::removeMultipleRow()
{
QTreeWidgetItem *currentItem = treeWidget->currentItem(); //当前的父类item
if(currentItem == NULL)
return ;
childrenItemMap.clear(); //每次清空列表
//将勾选子节点的item 全部放入map容器
if(currentItem->checkState(0) == Qt::Checked)
{ //删除父节点 以及该节点下的所有子节点
for(int i=0; i<currentItem->childCount(); i++)
{
index = currentItem->child(i)->text(3).toInt(); //第四列的序号
childrenItemMap.insert(currentItem->child(i), index);
}
}
else if(currentItem->checkState(0) == Qt::PartiallyChecked)
{ //只删除父节点下的部分节点, 有父节点就要用父节点的takeChild删除子节点
for(int i=0; i<currentItem->childCount(); i++)
{
if(currentItem->child(i)->checkState(0) == Qt::Checked)
{
index = currentItem->child(i)->text(3).toInt(); //第四列的序号
childrenItemMap.insert(currentItem->child(i), index);
}
}
}
//删除 子节点的item
for(QMap<QTreeWidgetItem *, int>::iterator it = childrenItemMap.begin(); it != childrenItemMap.end(); it++)
{
delete it.key(); //遍历 delete 删除子节点
}
//如果为全选 删除 父节点
if(currentItem->checkState(0) == Qt::Checked)
{
delete treeWidget->takeTopLevelItem(treeWidget->currentIndex().row());
}
}