树控件的应用广泛。好多功能都是基本的。网上也有一大堆。不过好多都有缺陷,树绕不来递归。这里也需要递归
void itemchanged(QTreeWidgetItem *item,int col)
{
if(!item) return;
updateChildItem( QTreeWidgetItem *item );
updateParentItem(QTreeWidgetItem *item);
}
void updateChildItem(QTreeWidgetItem *item)
{
if(!item) return;
int childcount =item.childCount();
auto state = item.checkState(0);
for(int i = 0; i < childcount;++i)
{
auto child = item.child(i);
if(child)
{
child.setCheckState(0,state);
updateChildItem(child);
}
}
}
void updateParentItem(QTreeWidgetItem *item)
{
auto parent = item.parent();
if(!parent) return;
int checknum,patiallynum ;
for(int i =0; i < parent.childCount();i++)
{
auto child = parent.child(i);
if(child.checkstate(0) == Qt::check)
checknum++;
if(child.checkstate(0) == Qt::partiallychecked)
patiallynum++;
}
//根据条件设置状态
if(checknum = count)
parent.setcheckstate(check);
if(checknum<= 0 && patiallynum < =0)
parent.setCheckstate(uncheck):;
if((checknum <= 0 && patiallynum > 0) ||(checknum <0 && patiallynum < count))
parent.setcheckstate(Qt::partiallychecked);
//最后递归
updateParentItem(parent);
}
手机打字。有些大小写自行改正。