QTreeWidget中的复选框及三态:勾选,未勾选,半勾选使用
在树形结构中有时候需要在每项前添加复选框,QTreeWidgetItem的复选框可以通过setCheckState(int column,Qt::CheckState state)方法调出。
勾选状态的改变,通过itemChanged(QTreeWidgetItem *item,int column)信号触发。
connect(ui->treeWidget,&QTreeWidget::itemChanged,this,&Widget::ItemCheckChanged);
//添加一个所有区域的顶级
QTreeWidgetItem *itemAll = new QTreeWidgetItem
(ui->treeMain, QStringList("所有区域[-1]")); //tempAreaParent
itemAll->setIcon(0, QIcon(":/image/Area.png"));
itemAll->setCheckState(0,Qt::Unchecked);
//绑定树选取事件
connect(ui->treeMain,SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,SLOT(treeItemChanged(QTreeWidgetItem*,int)));
实现树形结构的勾选常用操作:
1、父项勾选后,子项自动全部勾选
2、子项部分勾选后,父项为部分选中状态
3、当子项全部勾选后,父项也会随之勾选
void frmMain::treeItemChanged(QTreeWidgetItem *item, int column)
{
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);
}
}
}
void frmMain::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);
}
}
实现效果如下图:
得到选中的项目及状态代码:
QTreeWidgetItemIterator it(ui->treeMain);
while (*it) {
if((*it)->checkState(0)==Qt::Checked){
QMessageBox::information(this,"title",(*it)->text(0)); //得到选中列内容
ui->treeMain->setCurrentItem(*it); //设置为当前行
break;
}
++it;
}
备注:实战示例,解疑答惑。
--不间端地思考,实时地批判你的工作!