Qt 学习笔记 TreeWidget 增删改

简介: 在窗体上放一个TreeWidget控件和四个PushButton加一个Horizontal Spacer 布局如图 给树添加元素节点的方法和实现 .h文件 QTreeWidgetItem * AddTreeRoot(QString name,QString desc); ...

在窗体上放一个TreeWidget控件和四个PushButton加一个Horizontal Spacer

布局如图

给树添加元素节点的方法和实现

.h文件

    QTreeWidgetItem * AddTreeRoot(QString name,QString desc);
    QTreeWidgetItem * AddTreeNode(QTreeWidgetItem *parent,QString name,QString desc);

.cpp文件

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

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

在构造方法里添加元素设置树的列数和标题的名称
当然可以设置Header不显示,根据你的需求定

 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");

添加事件相对来说比较简单
直接调用我的前边写的方法,因为TreeWidget一直是选中状态就加了一个

添加根节点的槽

void TreeViewView::on_btn_Add_clicked()
{
    QTreeWidgetItem * item= ui->tv_Source->currentItem();
    if(item!=Q_NULLPTR)
    {
        AddTreeNode(item,"new","new");
    }
    else
    {
        AddTreeRoot("new","new");
    }
}

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

修改方法也很简单

void TreeViewView::on_btn_Modify_clicked()
{
    QTreeWidgetItem * currentItem = ui->tv_Source->currentItem();

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

删除槽就要考虑的多一点
要看它有没有父节点

void TreeViewView::on_btn_Del_clicked()
{
    QTreeWidgetItem * currentItem = ui->tv_Source->currentItem();

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

看一下效果

完整代码
.h文件

#ifndef TREEVIEWVIEW_H
#define TREEVIEWVIEW_H

#include <QDialog>
#include<QString>
#include<QTreeWidgetItem>
namespace Ui {
class TreeViewView;
}

class TreeViewView : public QDialog
{
    Q_OBJECT

public:
    explicit TreeViewView(QWidget *parent = 0);
    ~TreeViewView();

private slots:
    void on_tv_Source_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);

    void on_btn_Add_clicked();

    void on_btn_AddRoot_clicked();

    void on_btn_Del_clicked();

    void on_btn_Modify_clicked();

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

#endif // TREEVIEWVIEW_H

.cpp文件

#include "treeviewview.h"
#include "ui_treeviewview.h"
#include <QStringList>
TreeViewView::TreeViewView(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::TreeViewView)
{
    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");
}

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

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

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

void TreeViewView::on_tv_Source_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
{
    if(current==Q_NULLPTR)return;
    if(previous!=Q_NULLPTR)
    {
        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 TreeViewView::on_btn_Add_clicked()
{
    QTreeWidgetItem * item= ui->tv_Source->currentItem();
    if(item!=Q_NULLPTR)
    {
        AddTreeNode(item,"new","new");
    }
    else
    {
        AddTreeRoot("new","new");
    }
}

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

void TreeViewView::on_btn_Del_clicked()
{
    QTreeWidgetItem * currentItem = ui->tv_Source->currentItem();

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

void TreeViewView::on_btn_Modify_clicked()
{
    QTreeWidgetItem * currentItem = ui->tv_Source->currentItem();

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

 

 

 

 

 

目录
相关文章
|
3月前
|
SQL Java 数据库连接
MyBatis SQL 批量更新(代码➕案例)
MyBatis SQL 批量更新(代码➕案例)
558 0
|
4月前
|
SQL 关系型数据库 MySQL
【MySQL-5】DDL的数据库操作:查询&创建&删除&使用(可cv代码+演示图)
【MySQL-5】DDL的数据库操作:查询&创建&删除&使用(可cv代码+演示图)
|
4月前
|
SQL 关系型数据库 MySQL
【Unity 3D】C#从mysql数据库中读取、封装SQL语句(附源码)
【Unity 3D】C#从mysql数据库中读取、封装SQL语句(附源码)
242 0
|
数据库 C#
C#编程学习18:使用多文档窗体框架利用DataGridView对Access数据表进行增删改及导出excel操作
C#编程学习18:使用多文档窗体框架利用DataGridView对Access数据表进行增删改及导出excel操作
C#编程学习18:使用多文档窗体框架利用DataGridView对Access数据表进行增删改及导出excel操作
|
SQL 数据库 C++
C/C++ Qt 数据库QSql增删改查组件应用
Qt SQL模块是Qt中用来操作数据库的类,该类封装了各种SQL数据库接口,可以很方便的链接并使用,数据的获取也使用了典型的Model/View结构,通过MV结构映射我们可以实现数据与通用组件的灵活绑定,一般SQL组件常用的操作,包括,读取数据,插入数据,更新数据,删除数据,这四个功能我将分别介绍它是如何使用的。
309 0
C/C++ Qt 数据库QSql增删改查组件应用
|
Java 数据管理 数据库连接
curd 操作| 学习笔记
快速学习 curd 操作。
115 0
curd 操作| 学习笔记
|
关系型数据库 MySQL 数据库
MySQL数据库基础学习Day1:创建库与表(数据库操作、表操作、数据操作:增删改查)
MySQL数据库基础学习Day1:创建库与表(数据库操作、表操作、数据操作:增删改查)
137 0
MySQL数据库基础学习Day1:创建库与表(数据库操作、表操作、数据操作:增删改查)
|
SQL 存储 数据库
Sql知识总结-库表视图的增删改查
Sql知识总结-库表视图的增删改查
153 0
|
存储 SQL 安全
FMDB | 实现数据的增删改查
FMDB是一个轻量级的数据库,用于将网络资源存储在本地。 项目中使用 ARC 还是 MRC,对使用 FMDB 都没有任何影响,FMDB 会在编译项目时自动匹配。 FMDB 将 SQLite API 进行了很友好的封装,使用起来非常方便。
256 0
|
关系型数据库 MySQL 数据库
MySQL数据库(16):高级数据操作-更新数据
MySQL数据库(16):高级数据操作-更新数据