网上的例子一大堆,都没有想要的,大多遍历两层,如果树形结构很深那么就不行了,即使能够遍历深层树结构那么代码也是非常繁琐的,下面提供一种简单的方式,只需两个函数短短几行代码即可实现:
//隐藏表头
ui->treeWidget->setHeaderHidden(true);
//设置展开
ui->treeWidget->expandAll();
ui->treeWidget->setLayoutDirection(Qt::LeftToRight);//设置右到左排列
2.状态设置
//connect(ui->treeWidget,&QTreeWidget::itemClicked,this,&PushSelectUser::treeItemChanged);
void PushSelectUser::treeItemChanged(QTreeWidgetItem *item, int column)
{
updateParentItem(item);
// 设置子对象的勾选状态
for( int i=0;i<item->childCount();++i ){
if(item->checkState(0) == Qt::PartiallyChecked)
continue;
item->child(i)->setCheckState(0,item->checkState(0));
updateChildItem(item->child(i));
}
Qt::CheckState status = item->checkState(0);
sigSlectStatusChanged(item->text(0),status);
getSelectUsers();
}
void PushSelectUser::updateParentItem(QTreeWidgetItem *item)
{
// 更新父对象的勾选状态
QTreeWidgetItem* p = item->parent();
if( p!=0 ){
p->setCheckState(0,item->checkState(0));
for( int i=0;i<p->childCount();++i )
if( p->child(i)->checkState(0)!=item->checkState(0) || p->child(i)->checkState(0) == Qt::PartiallyChecked){
p->setCheckState(0,Qt::PartiallyChecked);
break;
}
updateParentItem(p);
}
}
void PushSelectUser::updateChildItem(QTreeWidgetItem *item)
{
// 更新zi对象的勾选状态
if( item!=0 ){
for( int i=0;i<item->childCount();++i ){
item->child(i)->setCheckState(0,item->checkState(0));
updateChildItem(item->child(i));
}
}
}
3.效果
![](https://img-blog.csdnimg.cn/c0ee3d6ff36d4d20bfb5afb0c8ae6985.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA55Wq6IyE5ZWK,size_20,color_FFFFFF,t_70,g_se,x_16)
QTreeWidget::indicator:checked {
image: url(:/images/home/4-选中.png);
}
QTreeWidget::indicator:unchecked {
image: url(:/images/home/4-未选中.png);
}
QTreeWidget::indicator:indeterminate {
image: url(:/images/home/3.png);
}