QTreeWidget实现勾选、半勾选、未勾选

 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);
    }
}
发布了34 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Sparrow_du/article/details/103014074