zoukankan      html  css  js  c++  java
  • Qt 学习笔记 TreeWidget 增删改

    在窗体上放一个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));
        }
    }
  • 相关阅读:
    .NetTiers不支持UDT的解决方式
    CreateRemoteThread的问题
    使用.NetTiers的事务
    how do i using c# to obtain call stack on crash?
    使用C#为进程创建DUMP文件
    GTD软件
    c#调用c++的dll
    使用PowerDesigner生成数据库
    笨鸟学iOS开发(2)ApplicationSettings
    让IIS支持中文名
  • 原文地址:https://www.cnblogs.com/li-peng/p/3652287.html
Copyright © 2011-2022 走看看