connect(ui->treeWidget,SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,SLOT(treeItemChanged(QTreeWidgetItem*,int)));
void treeItemChanged(QTreeWidgetItem *item, int column) { if(item->childCount()) { for( int i = 0; i < item->childCount(); i++ ) { item->child(i)->setCheckState(0, item->checkState(0)); treeItemChanged(item->child(i), 0); //递归改变父节点下的子节点check state } } else { QTreeWidgetItem* parent = item->parent(); while(parent != NULL) { if(item->checkState(0) != parent->checkState(0)) { int ncheck = 0; for( int i = 0; i < parent->childCount(); i++ ) { if( parent->child(i)->checkState(0) == Qt::Checked ) { ++ncheck; //统计父节点下子节点勾选个数 } } if(ncheck == parent->childCount()) parent->setCheckState(0,Qt::Checked); else if(ncheck == 0) parent->setCheckState(0,Qt::Unchecked); else parent->setCheckState(0,Qt::PartiallyChecked); } parent = parent->parent(); } } }