//mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QTreeWidgetItem>
namespace Ui {
class MyWidget;
}
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = 0);
~MyWidget();
private:
Ui::MyWidget *ui;
public:
void init();
void updateParentItem(QTreeWidgetItem* item);
public slots:
void treeItemChanged(QTreeWidgetItem* item,int column);
};
#endif // MYWIDGET_H
//mywidget.cpp
#include "mywidget.h"
#include "ui_mywidget.h"
#include <QDebug>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
init();
connect(ui->treeWidget,SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,
SLOT(treeItemChanged(QTreeWidgetItem*,int)));
}
MyWidget::~MyWidget()
{
delete ui;
}
//Qt 树形控件QTreewidget,控件里的数节点为QTreeWidgetItem
void MyWidget::init()
{
ui->treeWidget->clear();
//第一分组
QTreeWidgetItem *group1=new QTreeWidgetItem(ui->treeWidget);
group1->setText(0,"group1");
group1->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
group1->setCheckState(0,Qt::Unchecked);//设置默认有没有选中
QTreeWidgetItem *subItem11=new QTreeWidgetItem(group1);
subItem11->setText(0,"subItem11");
subItem11->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
subItem11->setCheckState(0,Qt::Unchecked);
QTreeWidgetItem *subItem12=new QTreeWidgetItem(group1);
subItem12->setText(0,"subItem12");
subItem12->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
subItem12->setCheckState(0,Qt::Unchecked);
QTreeWidgetItem *subItem13=new QTreeWidgetItem(group1);
subItem13->setText(0,"subItem13");
subItem13->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
subItem13->setCheckState(0,Qt::Unchecked);
//第二分组
QTreeWidgetItem *group2=new QTreeWidgetItem(ui->treeWidget);
group2->setText(0,"group2");
group2->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
group2->setCheckState(0,Qt::Unchecked);//设置默认有没有选中
QTreeWidgetItem *subItem21=new QTreeWidgetItem(group2);
subItem21->setText(0,"subItem21");
subItem21->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
subItem21->setCheckState(0,Qt::Unchecked);
QTreeWidgetItem *subItem22=new QTreeWidgetItem(group2);
subItem22->setText(0,"subItem22");
subItem22->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
subItem22->setCheckState(0,Qt::Unchecked);
QTreeWidgetItem *subItem23=new QTreeWidgetItem(group2);
subItem23->setText(0,"subItem23");
subItem23->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
subItem23->setCheckState(0,Qt::Unchecked);
}
void MyWidget::treeItemChanged(QTreeWidgetItem *item, int column)
{
QString itemText=item->text(0);//获取选中的名字
qDebug("SelectName = %s",qPrintable(itemText));
//选中时
if(Qt::Checked==item->checkState(0))
{
qDebug("选中");
QTreeWidgetItem* parent=item->parent();
int count=item->childCount();
if(count>0)
{
for(int i=0;i<count;++i)
{
//子节点也选中
item->child(i)->setCheckState(0,Qt::Checked);
}
}
else
{
//是子节点
updateParentItem(item);
}
}else if(Qt::Unchecked==item->checkState(0))
{
qDebug("取消选中");
int count=item->childCount();
if(count>0)
{
for(int i=0;i<count;++i)
{
//子节点都取消选中
item->child(i)->setCheckState(0,Qt::Unchecked);
}
}
else
{
//是子节点
updateParentItem(item);
}
}
}
void MyWidget::updateParentItem(QTreeWidgetItem *item)
{
QTreeWidgetItem *parent=item->parent();
if(parent==nullptr)
{
return;
}
//选中的子节点个数
int selectCount=0;
int childCount=parent->childCount();
//获取子节点选中的个数
for(int i=0;i<childCount;++i)
{
QTreeWidgetItem *childItem=parent->child(i);
if(childItem->checkState(0)==Qt::Checked)
{
selectCount++;
}
}
//根据子节点个数设置父节点的状态
if(selectCount<=0)
{
//选中状态
parent->setCheckState(0,Qt::Unchecked);
}
else if(selectCount>0&& selectCount<childCount)
{
//部分选中状态
parent->setCheckState(0,Qt::PartiallyChecked);
}
else if(selectCount==childCount)
{
//未选中状态
parent->setCheckState(0,Qt::Checked);
}
}