方法封装和connect(ui.treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(treeItemChanged(QTreeWidgetItem*, int)));
void initQTreeWidgetItem(QTreeWidgetItem *item, QString str, Qt::ItemFlags flags = Qt::ItemIsUserCheckable | Qt::ItemIsEnabled
| Qt::ItemIsSelectable, Qt::CheckState state = Qt::Unchecked, int column = 0)
{
item->setText(column, str);
item->setFlags(flags);
item->setCheckState(column, state);
}
void updateChildItem(QTreeWidgetItem *item, int column, Qt::CheckState state)
{
int count = item->childCount();
if (count > 0)
{
for (int i = 0; i < count; i++)
{
//判断是否有孩子当bb,如果当bb就递归。
auto childitem = item->child(i);
if (childitem!=nullptr)
{
updateChildItem(childitem, column, state);
}
item->child(i)->setCheckState(column, state);
}
}
}
void updateParentItem(QTreeWidgetItem *item, int column, Qt::CheckState state)
{
QTreeWidgetItem *parent = item->parent();
QTreeWidgetItem *yeye(nullptr);
if (parent == nullptr)
{
return;
}
int selectedCount = 0;
int partCount = 0;
int chiildCount = parent->childCount();
for (int i = 0; i < chiildCount; i++)
{
QTreeWidgetItem *childItem = parent->child(i);
if (childItem->checkState(column) == Qt::Checked )
{
selectedCount++;
}
if (childItem->checkState(column) == Qt::PartiallyChecked)
{
partCount++;
}
}
if (selectedCount <= 0 && partCount<=0)
{
parent->setCheckState(column, Qt::Unchecked);
}
else if (selectedCount > 0 && selectedCount < chiildCount)
{
parent->setCheckState(column, Qt::PartiallyChecked);
yeye = parent->parent();
while (yeye!=nullptr)
{
yeye->setCheckState(column, Qt::PartiallyChecked);
yeye = yeye->parent();
}
}
else if (selectedCount == chiildCount)
{
parent->setCheckState(column, Qt::Checked);
}
}
void treeItemChanged(QTreeWidgetItem *item, int column)
{
if (Qt::Checked == item->checkState(column))
{
updateChildItem(item, column, Qt::Checked);
updateParentItem(item, column, Qt::Checked);
}
else if (Qt::Unchecked == item->checkState(column))
{
updateChildItem(item, column, Qt::Unchecked);
updateParentItem(item, column, Qt::Unchecked);
}
}