QT带复选框的树节点的勾选逻辑

QT带复选框的树节点的勾选逻辑

 

QT5.12.6

 

.h

#pragma once

#include <QDialog>
#include <QDebug>
#include <QStandardItemModel>
#include "ui_Demo.h"

class Demo : public QDialog
{
    Q_OBJECT

public:
    Demo(QWidget *parent = Q_NULLPTR);

private slots:
    void treeItemChanged(QStandardItem*);
    void treeItem_CheckAllParent(QStandardItem* item, bool checked);
    void treeItem_CheckAllChild(QStandardItem*,bool checked);
private:
    Ui::DemoClass ui;
    QStandardItemModel* model = nullptr;
};
 

.cpp

#include "Demo.h"

Demo::Demo(QWidget *parent)
    : QDialog(parent)
    , model(new QStandardItemModel)
{
    ui.setupUi(this);
    ui.treeView->setModel(model);

    QStandardItem* root = new QStandardItem("parent");
    root->setCheckable(true);
    root->setUserTristate(true);
    model->appendRow(root);

    QStandardItem* child1 = new QStandardItem("child1");
    QStandardItem* child1_1 = new QStandardItem("child1");
    QStandardItem* child1_2 = new QStandardItem("child2");
    child1->setCheckable(true);
    child1->setUserTristate(true);
    child1_1->setCheckable(true);
    child1_2->setCheckable(true);
    child1->appendRow(child1_1);
    child1->appendRow(child1_2);

    QStandardItem* child2 = new QStandardItem("child2");
    QStandardItem* child2_1 = new QStandardItem("child1");
    QStandardItem* child2_2 = new QStandardItem("child2");
    child2->setCheckable(true);
    child2->setUserTristate(true);
    child2_1->setCheckable(true);
    child2_2->setCheckable(true);
    child2->appendRow(child2_1);
    child2->appendRow(child2_2);
    root->appendRow(child1);
    root->appendRow(child2);

    connect(model, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(treeItemChanged(QStandardItem*)));
    ui.treeView->expandAll();
}

void Demo::treeItemChanged(QStandardItem* item) {
    int checkState = item->checkState();
    if (checkState != Qt::PartiallyChecked) {
        for (int i = 0; i < item->rowCount(); i++)
            treeItem_CheckAllChild(item->child(i), checkState);
        if (item->parent()) treeItem_CheckAllParent(item->parent(), checkState);
    }
}

void Demo::treeItem_CheckAllChild(QStandardItem* item, bool checked) {
    item->setCheckState(checked ? Qt::Checked : Qt::Unchecked);
    for (int i = 0; i < item->rowCount(); i++) 
        treeItem_CheckAllChild(item->child(i), checked);
}

void Demo::treeItem_CheckAllParent(QStandardItem* item, bool checked) {

    double checkCount = 0;
    for (int i = 0; i < item->rowCount(); i++) {
        int checkState = item->child(i)->checkState();
        switch (checkState) {
        case Qt::Checked:
            checkCount++;
            break;
        case Qt::PartiallyChecked:
            checkCount+=0.5;
            break;
        }
    }
    if (checkCount == item->rowCount()) item->setCheckState(Qt::Checked);
    else if (checkCount == 0) item->setCheckState(Qt::Unchecked);
    else item->setCheckState(Qt::PartiallyChecked);

    if(item->parent()) treeItem_CheckAllParent(item->parent(), checked);
}

 

.ui

拖拽一个QTreeView

 

如果有更加优化的做法,请在下方评论进行交流,2021.3.30

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值