第一种方法:在创建每一个QTreeWidgetItem时,添加如下代码:
pItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsAutoTristate); //设置树形控件子项的属性
第二种方法:
当顶层节点有多个时,实现了顶层节点相互之间互斥选择!
首先,在创建树节点的时候,设置每个节点如下:
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) { 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); } }
当顶层节点有多个时,实现了顶层节点相互之间互斥选择!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)