QTreeWidget设置树节点可以三种选择状态,且可以互斥选择
第一种方法:在创建每一个QTreeWidgetItem时,添加如下代码:
//在创建的每个节点下,加上下面代码
pItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsAutoTristate); //设置树形控件子项的属性
pItem->setCheckState(0, Qt::Unchecked);//也可以是其他状态
第二种方法:
当顶层节点有多个时,实现了顶层节点相互之间互斥选择!
首先,在创建树节点的时候,设置每个节点如下:
pItem->setCheckState(0, Qt::Unchecked);
并且在QTreeWidget加如下信号槽函数:
connect(m_pTreeWidget, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(treeItemChanged(QTreeWidgetItem*, int)));
实现信号槽函数:
void CombatMissionMgrWidget::treeItemChanged(QTreeWidgetItem *item, int column)
{
QTreeWidgetItemIterator it(m_pTreeWidget);
//由未选择变为选择状态的某个根节点
if (item->type() == Type_CombatMission)
{
if (HC) //HC起到互斥量的作用,为私有变量成员,初始值设为1
{
if (item->checkState(0) == Qt::Checked || item->checkState(0) == Qt::PartiallyChecked)
{
//互斥量做标记
HC = 0;
while (*it)
{
if (*it == item || item == (*it)->parent())
{
++it;
continue;
}
else if ((*it)->type() == Type_CombatMission)
{
(*it)->setCheckState(0, Qt::Unchecked);
}
++it;
}
}
}
}
QString itemText = item->text(0);
if (item->checkState(0) == Qt::Checked)
{
QTreeWidgetItem *parent = item->parent();
int cnt = item->childCount();
if (cnt > 0)
{
for (int i = 0; i < cnt; i++)
{
item->child(i)->setCheckState(0, Qt::Checked);
}
}
else
{
updateParentItem(item);
}
}
else if (item->checkState(0) == Qt::Unchecked)
{
int cnt = item->childCount();
if (cnt > 0)
{
for (int i = 0; i < cnt; i++)
{
item->child(i)->setCheckState(0, Qt::Unchecked);
}
}
else
{
updateParentItem(item);
}
}
//互斥量恢复
HC = 1;
}
同时,槽函数调用了另一个函数:
void CombatMissionMgrWidget::updateParentItem(QTreeWidgetItem *item)
{
QTreeWidgetItem *parent = item->parent();
if (parent == NULL)
{
return;
}
//选中的子节点个数
int selectedCount = 0;
int childCount = parent->childCount();
for (int i = 0; i < childCount; i++)
{
QTreeWidgetItem *childItem = parent->child(i);
if (childItem->checkState(0) == Qt::Checked)
{
selectedCount++;
}
}
if (selectedCount <= 0)
{
//未选中状态
parent->setCheckState(0, Qt::Unchecked);
}
else if (selectedCount > 0 && selectedCount < childCount)
{
//部分选中状态
parent->setCheckState(0, Qt::PartiallyChecked);
}
else if (selectedCount == childCount)
{
//选中状态
parent->setCheckState(0, Qt::Checked);
}
}
当顶层节点有多个时,实现了顶层节点相互之间互斥选择!