//test.h
//在頭文件裏添加兩個公用函數還有一個槽函數的聲明
#include <QTreeWidgetItem>
public:
void initTreeWidget();
void updateParentItem(QTreeWidgetItem *item);
public:
void treeItemChanged(QTreeWidgetItem *item,int column);
//test.cpp
//在構造函數裏添加 connect()
initTreeWidget();
connect(ui->treeWidget,SIGNAL(itemChanged(QTreeWidgetItem *,int)),this,SLOT(treeItemChanged(QTreeWidgetItem*,int)));
//initTreeWidget() 的實現
void test::initTreeWidget()
{
ui->treeWidget->clear();
//第一組
QTreeWidgetItem *group1=new QTreeWidgetItem(ui->treeWidget);
group1->setText(0,"group1");
group1->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
group1->setCheckState(0,Qt::Unchecked);
QTreeWidgetItem *item11=new QTreeWidgetItem(group1);
item11->setText(0,"item11");
item11->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
item11->setCheckState(0,Qt::Unchecked);
QTreeWidgetItem *item12=new QTreeWidgetItem(group1);
item12->setText(0,"item12");
item12->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
item12->setCheckState(0,Qt::Unchecked);
QTreeWidgetItem *item13=new QTreeWidgetItem(group1);
item13->setText(0,"item13");
item13->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
item13->setCheckState(0,Qt::Unchecked);
//第二組
QTreeWidgetItem *group2=new QTreeWidgetItem(ui->treeWidget);
group2->setText(0,"group2");
group2->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
group2->setCheckState(0,Qt::Unchecked);
QTreeWidgetItem *item21=new QTreeWidgetItem(group2);
item21->setText(0,"item21");
item21->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
item21->setCheckState(0,Qt::Unchecked);
QTreeWidgetItem *item22=new QTreeWidgetItem(group2);
item22->setText(0,"item22");
item22->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
item22->setCheckState(0,Qt::Unchecked);
QTreeWidgetItem *item23=new QTreeWidgetItem(group2);
item23->setText(0,"item23");
item23->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
item23->setCheckState(0,Qt::Unchecked);
}
//treeItemChanged(QTreeWidgetItem *item, int column)的實現
void test::treeItemChanged(QTreeWidgetItem *item, int column)
{
QString itemText=item->text(0);
//選中時
if(Qt::Checked==item->checkState(0))
{
QTreeWidgetItem* parent=item->parent();
int count=item->childCount();
if(count>0)
{
for(int i=0;i<count;i++)
{
//子節點也被選中
item->child(i)->setCheckState(0,Qt::Checked);
}
}
else
{
//是子節點
updateParentItem(item);
}
}
else if(Qt::Unchecked==item->checkState(0))
{
int count=item->childCount();
if(count>0)
{
for(int i=0;i<count;i++)
{
item->child(i)->setCheckState(0,Qt::Unchecked);
}
}
else
{
//是子節點
updateParentItem(item);
}
}
}
//updateParentItem(QTreeWidgetItem *item) 的實現
void test::updateParentItem(QTreeWidgetItem *item)
{
QTreeWidgetItem* parent=item->parent();
if(parent==NULL)
{
return;
}
//選中的子節點個數
int selectCount=0;
int childCount=parent->childCount();
for(int i=0;i<childCount;i++)
{
QTreeWidgetItem *childItem=parent->child(i);
if(childItem->checkState(0)==Qt::Checked)
{
selectCount++;
}
}
if(selectCount<=0)
{
//選中狀態
parent->setCheckState(0,Qt::Unchecked);
}
else if(selectCount>0 && selectCount<childCount)
{
//部分選中狀態
parent->setCheckState(0,Qt::PartiallyChecked);
}
else if(selectCount==childCount)
{
//未選中狀態
parent->setCheckState(0,Qt::Checked);
}
}