向TreeWidget中添加根/子节点,删除节点,修改节点

拖一个TreeWidget 控件 改名 tv_Source

拖拉四个Button 按钮 分别取名btn_AddRoot,  btn_Add,  btn_Del,   btn_Modify

给四个按钮添加槽函数(clicked)

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDialog>
#include <QString>
#include <QTreeWidgetItem>


namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
    
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

public slots:
    void on_tv_Source_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
    void on_btn_Add_clicked();
    void on_btn_Modify_clicked();
    void on_btn_Del_clicked();
    void on_btn_AddRoot_clicked();


private:
    Ui::Widget *ui;
    QTreeWidgetItem * AddTreeRoot(QString name,QString desc);
    QTreeWidgetItem * AddTreeNode(QTreeWidgetItem *parent,QString name,QString desc);
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QStringList>


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->tv_Source->setColumnCount(2);
    ui->tv_Source->setHeaderLabels(QStringList()<<"Name"<<"Description");
    //ui->tv_Source->setHeaderHidden(true);
    QTreeWidgetItem * beiJingItem = AddTreeRoot("bejing","city");
    AddTreeNode(beiJingItem,"haidian","HaiDian");
    AddTreeNode(beiJingItem,"chaoYang","chaoYang");
    AddTreeNode(beiJingItem,"fengTai","fengTai");
    QTreeWidgetItem * HeiBeiItem =AddTreeRoot("hebei","city");
    AddTreeNode(HeiBeiItem,"baoDing","baoDing");
    AddTreeNode(HeiBeiItem,"shiJiaZhuang","shiJiaZhuang");
}

Widget::~Widget()
{
    delete ui;
}
QTreeWidgetItem * Widget::AddTreeRoot(QString name,QString desc)
{
    QTreeWidgetItem * item=new QTreeWidgetItem(QStringList()<<name<<desc);
    ui->tv_Source->addTopLevelItem(item);
    return item;
}

QTreeWidgetItem * Widget::AddTreeNode(QTreeWidgetItem *parent,QString name,QString desc)
{
    QTreeWidgetItem * item=new QTreeWidgetItem(QStringList()<<name<<desc);
    parent->addChild(item);
    return item;
}

void Widget::on_tv_Source_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
{
    if(current==NULL)
        return;
    if(previous!=NULL)
    {
        previous->setBackground(0,Qt::transparent);
        previous->setBackground(1,Qt::transparent);
        previous->setTextColor(0,Qt::black);
        previous->setTextColor(1,Qt::black);
    }
    current->setTextColor(0,Qt::blue);
    current->setTextColor(1,Qt::blue);
    current->setBackground(0,Qt::red);
    current->setBackground(1,Qt::red);
}

//添加
void Widget::on_btn_Add_clicked()
{
    QTreeWidgetItem * item= ui->tv_Source->currentItem();
    if(item!=NULL)
    {
        AddTreeNode(item,"new","new");
    }
    else
    {
        AddTreeRoot("new","new");
    }
}


//修改
void Widget::on_btn_Modify_clicked()
{
    QTreeWidgetItem * currentItem = ui->tv_Source->currentItem();

    if(currentItem==NULL)
    {
        return;
    }
    for(int i=0;i<currentItem->columnCount();i++)
    {
        currentItem->setText(i,tr("Modify")+QString::number(i));
    }
}

//删除
void Widget::on_btn_Del_clicked()
{
    QTreeWidgetItem * currentItem = ui->tv_Source->currentItem();

    if(currentItem==NULL)
    {
        return;
    }
    //如果没有父节点就直接删除
    if(currentItem->parent()==NULL)
    {
        delete ui->tv_Source->takeTopLevelItem(ui->tv_Source->currentIndex().row());
    }
    else
    {
        //如果有父节点就要用父节点的takeChild删除节点
        delete currentItem->parent()->takeChild(ui->tv_Source->currentIndex().row());
    }
}

void Widget::on_btn_AddRoot_clicked()
{
     AddTreeRoot("new","new");
}

实现效果: 

源码下载地址:https://download.csdn.net/download/weixin_40569991/10730744 

参考:https://www.cnblogs.com/li-peng/p/3652287.html

`QTreeWidget` 是 Qt 框架中的一个组件,用于显示层次结构的数据,比如文件系统、菜单树等。遍历 `QTreeWidget` 的某个节点(也称为 item)的子节点通常使用 `QTreeWidgetItemIterator` 或者直接操作 `parent()` 和 `childCount()` 方法。 以下是一个基本的例子,展示了如何使用 `QTreeWidgetItemIterator` 遍历子节点: ```cpp #include <QApplication> #include <QTreeWidget> #include <QTreeWidgetItem> int main(int argc, char *argv[]) { QApplication app(argc, argv); QTreeWidget *tree = new QTreeWidget; tree->setColumnCount(1); // 设置一列 // 添加根节点 QStringList items {"Item 1", "Item 2", "Item 3"}; for (const QString &item : items) { QTreeWidgetItem *rootItem = new QTreeWidgetItem(tree); rootItem->setText(0, item); // 为每个根节点添加子项 for (int i = 0; i < 3; ++i) { QTreeWidgetItem *subItem = new QTreeWidgetItem(rootItem); subItem->setText(0, QString("Sub Item %1").arg(i + 1)); } } // 遍历第一个根节点子节点 QTreeWidgetItemIterator it(tree); while (*it) { if (it.parent() == tree) { // 判断是否是根节点的第一个子节点 qDebug() << "Current child: " << it.text(0); ++it; // 移动到下一个子节点 } else { break; // 如果不是根节点子节点则跳出循环 } } return app.exec(); } ``` 在这个例子中,我们首先创建了一个 `QTreeWidget` 并添加了一些根节点子节点。然后使用 `QTreeWidgetItemIterator` 遍历第一个根节点(通过检查其父节点是否为空),打印出每个子节点的文字。 如果你需要遍历任意节点子节点,只需修改判断条件即可,例如用 `it.parent()` 指向特定的节点
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值