在窗体上放一个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)); } }