seletemenuwidget.h
#ifndef SELETEMENUWIDGET_H
#define SELETEMENUWIDGET_H
#include <QWidget>
#include <QTreeWidgetItem>
namespace Ui {
class SeleteMenuWidget;
}
class SeleteMenuWidget : public QWidget
{
Q_OBJECT
public:
explicit SeleteMenuWidget(QWidget *parent = nullptr);
~SeleteMenuWidget();
private:
void updateChild(QTreeWidgetItem *item);
void updateParent(QTreeWidgetItem *item);
private:
Ui::SeleteMenuWidget *ui;
void setParentPartiallyChecked(QTreeWidgetItem *itm);
};
#endif // SELETEMENUWIDGET_H
seletemenuwidget.cpp
#include "seletemenuwidget.h"
#include "ui_seletemenuwidget.h"
SeleteMenuWidget::SeleteMenuWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::SeleteMenuWidget)
{
ui->setupUi(this);
connect(ui->treeWidget, &QTreeWidget::itemClicked,this, [this](QTreeWidgetItem *item, int column){
updateChild(item);
updateParent(item);
});
}
SeleteMenuWidget::~SeleteMenuWidget()
{
delete ui;
}
void SeleteMenuWidget::updateChild(QTreeWidgetItem *item)
{
if(item->checkState(0) == Qt::PartiallyChecked) return;
int child_count = item->childCount();
if(child_count > 0) {
for(int i =0; i < child_count; i++) {
item->child(i)->setCheckState(0, item->checkState(0));
if(item->child(i)->childCount() > 0) {
updateChild(item->child(i));
}
}
}
}
void SeleteMenuWidget::setParentPartiallyChecked(QTreeWidgetItem *itm)
{
QTreeWidgetItem *parent = itm->parent();
if(parent) {
parent->setCheckState(0,Qt::PartiallyChecked);
setParentPartiallyChecked(parent);
}
}
void SeleteMenuWidget::updateParent(QTreeWidgetItem *item)
{
QTreeWidgetItem *parent = item->parent();
if(parent)
{
int checkedCount = 0;
int patiallyCount = 0;
int itemCount = parent->childCount();
for(int i = 0; i < itemCount; i++) {
QTreeWidgetItem *item = parent->child(i);
if(Qt::Checked == item->checkState(0))
checkedCount++;
else if(Qt::PartiallyChecked == item->checkState(0))
patiallyCount++;
}
if(checkedCount <= 0 ) {
if(patiallyCount > 0)
goto Partially;
else
parent->setCheckState(0,Qt::Unchecked);
} else if(checkedCount > 0 && checkedCount < itemCount ) {
Partially:
parent->setCheckState(0,Qt::PartiallyChecked);
setParentPartiallyChecked(parent);
return;
} else if(checkedCount > 0 && checkedCount == itemCount) {
parent->setCheckState(0,Qt::Checked);
}
updateParent(parent);
}
}