void KbdDevListDlg::onItemChanged(QStandardItem* item)
{
disconnect(m_modelDevInst,SIGNAL(itemChanged(QStandardItem*)),this,SLOT(onItemChanged(QStandardItem*)));
//修改子节点状态
changeChildsState(item);
//修改父节点状态
changeParentsState(item);
connect(m_modelDevInst,SIGNAL(itemChanged(QStandardItem*)),this,SLOT(onItemChanged(QStandardItem*)));
}
void KbdDevListDlg::changeChildsState(QStandardItem* item)
{
if(item->rowCount() > 0)
{
for(int i = 0; i < item->rowCount(); i++)
{
QStandardItem* child = item->child(i);
if(item->checkState() == Qt::Checked)
child->setCheckState(Qt::Checked);
else if(item->checkState() == Qt::Unchecked)
child->setCheckState(Qt::Unchecked);
changeChildsState(child);
}
}
}
void KbdDevListDlg::changeParentsState(QStandardItem* item)
{
if(item->parent())
{
QStandardItem* parent = item->parent();
if(item->checkState() == Qt::Unchecked || item->checkState() == Qt::PartiallyChecked )
parent->setCheckState(Qt::PartiallyChecked);
else if(item->checkState() == Qt::Checked)
{
//判断兄弟节点是否全选
bool allChecked = true;
for(int i = 0; i < parent->rowCount(); i++)
{
QStandardItem* brother = parent->child(i);
if(brother->checkState() != Qt::Checked)
{
allChecked = false;
break;
}
}
if(allChecked)
parent->setCheckState(Qt::Checked);
}
changeParentsState(parent);
}
}