使用QTreeWidget -- 自用
复选框改变槽函数
void LineListForm::treeItemChanged(QTreeWidgetItem *item, int column)
{
int count = item->childCount();
Qt::CheckState state = item->checkState(0);
if (count > 0)
{
for (int i = 0; i < count; i++)
{
item->child(i)->setCheckState(0, state);
setItemCheckState(item->child(i), state == Qt::Checked ? true : false);
}
}
updateParentItem(item);
}
对父节点和子节点做处理,多级使用递归方式实现(效率未测试):
void LineListForm::setItemCheckState(QTreeWidgetItem *item, bool check)
{
if(item == nullptr)
return;
int count = item->childCount();
Qt::CheckState state = item->checkState(0);
if(count>0)
{
for(int i = 0; i < count; i++)
{
item->child(i)->setCheckState(0, check == true ? Qt::Checked : Qt::Unchecked );
setItemCheckState(item->child(i), state == Qt::Checked ? true : false); //递归
}
}
}
void LineListForm::setAllChildCheckState(QTreeWidgetItem *item, bool check)
{
if(item == nullptr)
return;
int rowCount = item->childCount();
for(int i=0;i<rowCount;++i)
{
QTreeWidgetItem* childItems = item->child(i);
setItemCheckState(childItems,check);
}
if(item->checkState(0))
item->setCheckState(0, check ? Qt::Checked : Qt::Unchecked);
}
void LineListForm::updateParentItem(QTreeWidgetItem *item)
{
QTreeWidgetItem *parent = item->parent();
if (parent == NULL)
return;
int nSelectedCount = 0;
int childCount = parent->childCount();
for (int i = 0; i < childCount; i++)
{
QTreeWidgetItem* childItem = parent->child(i);
if (childItem->checkState(0) == Qt::Checked || childItem->checkState(0) == Qt::PartiallyChecked)
{
nSelectedCount++;
}
}
// 三态
if (nSelectedCount <= 0)
parent->setCheckState(0, Qt::Unchecked);
else if (nSelectedCount > 0 && nSelectedCount < childCount)
parent->setCheckState(0, Qt::PartiallyChecked);
else if (nSelectedCount == childCount)
parent->setCheckState(0, Qt::Checked);
updateParentItem(parent); //递归
}