程序
首先从工具栏拉入一个TreeWidget.
//.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTreeWidgetItem>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
void init();
void updateParentItem(QTreeWidgetItem* item);
public slots:
void treeItemChanged(QTreeWidgetItem* item, int column);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
//.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
init();
connect(ui->treeWidget,SIGNAL(itemChanged(QTreeWidgetItem*,int)),
this,SLOT(treeItemChanged(QTreeWidgetItem*, int )));//连接槽函数节点改变
}
Widget::~Widget()
{
delete ui;
}
void Widget::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->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
subItem11->setText(0,"subItem11");
subItem11->setCheckState(0,Qt::Unchecked);
QTreeWidgetItem *subItem12 =new QTreeWidgetItem(group1);
subItem12->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
subItem12->setText(0,"subItem12");
subItem12->setCheckState(0,Qt::Unchecked);
QTreeWidgetItem *subItem13 =new QTreeWidgetItem(group1);
subItem13->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
subItem13->setText(0,"subItem13");
subItem13->setCheckState(0,Qt::Unchecked);
QTreeWidgetItem *subItem14 =new QTreeWidgetItem(group1);
subItem14->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
subItem14->setText(0,"subItem14");
subItem14->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->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
subItem21->setText(0,"subItem21");
subItem21->setCheckState(0,Qt::Unchecked);
QTreeWidgetItem *subItem22 =new QTreeWidgetItem(group2);
subItem22->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
subItem22->setText(0,"subItem22");
subItem22->setCheckState(0,Qt::Unchecked);
QTreeWidgetItem *subItem23 =new QTreeWidgetItem(group2);
subItem23->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
subItem23->setText(0,"subItem23");
subItem23->setCheckState(0,Qt::Unchecked);
QTreeWidgetItem *subItem24 =new QTreeWidgetItem(group2);
subItem24->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
subItem24->setText(0,"subItem24");
subItem24->setCheckState(0,Qt::Unchecked);
}
void Widget::treeItemChanged(QTreeWidgetItem *item, int column)
{
if(Qt::Checked == item->checkState(0))//父节点被选中,子节点全选
{
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))//父节点取消选中,子节点全部取消选中
{
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 Widget::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);//父节点选中
}
}