这段代码是一个使用Qt框架的C++程序,实现了一个树形结构的窗口小部件(TreeWidget
)。以下是主要的解释:
#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);
}
构造函数和析构函数:
TreeWidget::TreeWidget(QWidget *parent)
:构造函数,初始化了UI并调用了initTree
方法来初始化树形结构。TreeWidget::~TreeWidget()
:析构函数,负责释放UI资源。addChild模板方法:
TreeWidget::addChild(T parent, const QString& text)
:是一个模板方法,用于添加树形结构中的子项(QTreeWidgetItem)。它创建一个新的子项,设置其显示文本为给定的文本,然后返回这个新的子项。initTree方法:
TreeWidget::initTree()
:在这个方法中,创建了一个树的顶层项(“top”)和一些子项和孙子项,形成了一个树形结构。设置了每个项的复选框状态,并最后展开了整个树。updateParentItemStatus和updateChildItemStatus方法:
TreeWidget::updateParentItemStatus(QTreeWidgetItem* item)
:递归更新父项的复选框状态。如果子项的状态与父项的状态不同,则设置父项的状态为部分选中。TreeWidget::updateChildItemStatus(QTreeWidgetItem* item)
:递归更新子项的复选框状态,将其状态设置为与父项相同。slot_treeItemChanged槽函数:
TreeWidget::slot_treeItemChanged(QTreeWidgetItem* item, int)
:这是一个槽函数,与QTreeWidget
的itemChanged
信号连接。当树中的项的状态发生变化时,此槽函数被调用。它通过调用updateChildItemStatus
和updateParentItemStatus
方法来更新相关的子项和父项的状态。