mytreetest.h文件
#ifndef MYTREETEST_H
#define MYTREETEST_H
#include <QWidget>
#include<QTreeWidget>
#include<QTreeWidgetItem>
class MyTreeTest : public QWidget
{
Q_OBJECT
public:
explicit MyTreeTest(QWidget *parent = 0);
void init();
void updateParentItem(QTreeWidgetItem* item);
signals:
public slots:
void treeItemChanged(QTreeWidgetItem* item, int column);
private:
QTreeWidget* m_treeWidget;
};
#endif // MYTREETEST_H
mytreetest.cpp文件
#include "mytreetest.h"
#include <QDebug>
MyTreeTest::MyTreeTest(QWidget *parent) : QWidget(parent)
{
m_treeWidget = new QTreeWidget(this);
init();
connect(m_treeWidget,SIGNAL(itemChanged(QTreeWidgetItem*, int)),
this, SLOT(treeItemChanged(QTreeWidgetItem*, int)));
}
void MyTreeTest::init()
{
m_treeWidget->clear();
//第一个分组
QTreeWidgetItem *g1 = new QTreeWidgetItem(m_treeWidget);
g1->setText(0, "g1");
g1->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt:: ItemIsSelectable);
g1->setCheckState(0, Qt::Unchecked);
QTreeWidgetItem *s11 = new QTreeWidgetItem(g1);
s11->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt:: ItemIsSelectable);
s11->setText(0, "s11");
s11->setCheckState(0, Qt::Unchecked);
QTreeWidgetItem *s12 = new QTreeWidgetItem(g1);
s12->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt:: ItemIsSelectable);
s12->setText(0, "s12");
s12->setCheckState(0, Qt::Unchecked);
//第二个分组
QTreeWidgetItem *g2 = new QTreeWidgetItem(m_treeWidget);
g2->setText(0, "g2");
g2->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt:: ItemIsSelectable);
g2->setCheckState(0, Qt::Unchecked);
QTreeWidgetItem *s21 = new QTreeWidgetItem(g2);
s21->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt:: ItemIsSelectable);
s21->setText(0, "s21");
s21->setCheckState(0, Qt::Unchecked);
}
void MyTreeTest::updateParentItem(QTreeWidgetItem *item)
{
QTreeWidgetItem *parent = item->parent();
if (parent == NULL)
{
return;
}
int selectedCount = 0;
int partiallyCount = 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 (childItem->checkState(0) == Qt::PartiallyChecked)
{
partiallyCount++;
}
}
if (selectedCount <= 0)
{
//选中状态
parent->setCheckState(0, Qt::Unchecked);
}
else if (selectedCount > 0 && selectedCount < childCount)
{
//部分选中状态
parent->setCheckState(0, Qt::PartiallyChecked);
}
else if (selectedCount == childCount)
{
if(partiallyCount>0){
parent->setCheckState(0, Qt::PartiallyChecked);
}else{
parent->setCheckState(0, Qt::Checked);
}
//未选中状态
}
}
void MyTreeTest::treeItemChanged(QTreeWidgetItem *item, int column)
{
QString itemText = item->text(0);
qDebug() << "itemText=" << itemText;
//选中时
if (Qt::Checked == item->checkState(0))
{
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))
{
int count = item->childCount();
if (count > 0)
{
for (int i = 0; i < count; i++)
{
item->child(i)->setCheckState(0, Qt::Unchecked);
}
}
else
{
updateParentItem(item);
}
}
else{
updateParentItem(item);
}
}
运行效果