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