树形结构的窗口小部件

这段代码是一个使用Qt框架的C++程序,实现了一个树形结构的窗口小部件(TreeWidget)。以下是主要的解释:

cpp 复制代码
#include "treewidget.h"
#include "ui_treewidget.h"

TreeWidget::TreeWidget(QWidget *parent) : QWidget(parent), ui(new Ui::TreeWidget)
{
    ui->setupUi(this);
    initTree();
}

TreeWidget::~TreeWidget()
{
    delete ui;
}

template<typename T>
QTreeWidgetItem* TreeWidget::addChild(T parent, const QString& text)
{
    auto item = new QTreeWidgetItem(parent, QStringList(text));
    item->setCheckState(0, Qt::Unchecked);
    return item;
}

void TreeWidget::initTree()
{
    auto item = addChild(ui->tree, "top");
    QList<QTreeWidgetItem*> listChild;
    for(int nIndex = 1; nIndex <= 5; ++nIndex)
    {
        auto pItem = addChild(item, QString("child%1").arg(nIndex));
        listChild.append(pItem);
    }

    for(const auto& child : listChild)
    {
        for(int nRet = 1; nRet <= 5; ++nRet)
        {
            addChild(child, QString("grandchild%1").arg(nRet));
        }
    }
    ui->tree->expandAll();
}

void TreeWidget::updateParentItemStatus(QTreeWidgetItem* item)
{
    auto parent = item->parent();
    if (Q_NULLPTR == parent)
    {
        return;
    }

    parent->setCheckState(0, item->checkState(0));

    int nCount = parent->childCount();
    for (int nIndex = 0; nIndex < nCount; ++nIndex)
    {
        auto child = parent->child(nIndex);
        if (child->checkState(0) != parent->checkState(0))
        {
            parent->setCheckState(0, Qt::PartiallyChecked);
            break;
        }
    }

    updateParentItemStatus(parent);
}

void TreeWidget::updateChildItemStatus(QTreeWidgetItem* item)
{
    int nCount = item->childCount();
    for (int nIndex = 0; nIndex < nCount; ++nIndex)
    {
        auto child = item->child(nIndex);
        child->setCheckState(0, item->checkState(0));
        if (child->childCount() > 0)
        {
            updateChildItemStatus(child);
        }
    }
}

void TreeWidget::slot_treeItemChanged(QTreeWidgetItem* item, int)
{

    updateChildItemStatus(item);
    updateParentItemStatus(item);
}
  1. 构造函数和析构函数:

    • TreeWidget::TreeWidget(QWidget *parent):构造函数,初始化了UI并调用了initTree方法来初始化树形结构。
    • TreeWidget::~TreeWidget():析构函数,负责释放UI资源。
  2. addChild模板方法:

    • TreeWidget::addChild(T parent, const QString& text):是一个模板方法,用于添加树形结构中的子项(QTreeWidgetItem)。它创建一个新的子项,设置其显示文本为给定的文本,然后返回这个新的子项。
  3. initTree方法:

    • TreeWidget::initTree():在这个方法中,创建了一个树的顶层项("top")和一些子项和孙子项,形成了一个树形结构。设置了每个项的复选框状态,并最后展开了整个树。
  4. updateParentItemStatus和updateChildItemStatus方法:

    • TreeWidget::updateParentItemStatus(QTreeWidgetItem* item):递归更新父项的复选框状态。如果子项的状态与父项的状态不同,则设置父项的状态为部分选中。
    • TreeWidget::updateChildItemStatus(QTreeWidgetItem* item):递归更新子项的复选框状态,将其状态设置为与父项相同。
  5. slot_treeItemChanged槽函数:

    • TreeWidget::slot_treeItemChanged(QTreeWidgetItem* item, int):这是一个槽函数,与QTreeWidgetitemChanged信号连接。当树中的项的状态发生变化时,此槽函数被调用。它通过调用updateChildItemStatusupdateParentItemStatus方法来更新相关的子项和父项的状态。
相关推荐
范纹杉想快点毕业2 小时前
Qt构造函数详解:布局与快捷键实战
c语言·开发语言·数据库·c++·qt·命令模式
wulitoud14 小时前
vim 编辑模式/命令模式/视图模式常用命令
vim·excel·命令模式
范纹杉想快点毕业1 天前
解析Qt文件保存功能实现
java·开发语言·c++·算法·命令模式
码农颜5 天前
java 设计模式_行为型_19命令模式
java·设计模式·命令模式
qqxhb10 天前
零基础设计模式——行为型模式 - 命令模式
java·设计模式·go·命令模式
牛奶咖啡1313 天前
学习设计模式《十二》——命令模式
学习·设计模式·命令模式·队列请求·宏命令·可撤销恢复操作·参数化配置
熙客19 天前
行为型:命令模式
命令模式
季鸢23 天前
Java设计模式之命令模式详解
java·设计模式·命令模式
小小数媒成员23 天前
命令模式,观察者模式,状态模式,享元模式
观察者模式·策略模式·命令模式
Echo``23 天前
8:OpenCV—仿射变换和坐标映射
开发语言·图像处理·人工智能·qt·opencv·计算机视觉·命令模式