?使用 QTreeWidget 實現復雜樹控件功能的詳細教程_treewidget 加控件-CSDN博客
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTreeWidget>
namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private:Ui::MainWindow *ui;QTreeWidget * treeWidget;
};#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);treeWidget = new QTreeWidget;QVBoxLayout *layout = new QVBoxLayout();layout->addWidget(treeWidget);QWidget *centralWidget = new QWidget(this);centralWidget->setLayout(layout);setCentralWidget(centralWidget);treeWidget->setColumnCount(3);QStringList headers;headers << QString("班級")<< QString("分配科目")<< QString("是否達標");treeWidget->setHeaderLabels(headers);QTreeWidgetItem *item = new QTreeWidgetItem(treeWidget);item->setText(0, QString("某班級"));item->setCheckState(2, Qt::Unchecked);QTreeWidgetItem *topLevelItem = new QTreeWidgetItem(treeWidget);topLevelItem->setText(0, QString("頂層項目"));treeWidget->addTopLevelItem(topLevelItem);
}MainWindow::~MainWindow()
{delete ui;
}
QTreeWidgetItem *newTopLevelItem = new QTreeWidgetItem();newTopLevelItem->setText(0, QString("插入頂層項目"));newTopLevelItem->setText(1,"第1列");newTopLevelItem->setText(2,"第2列");treeWidget->insertTopLevelItem(0, newTopLevelItem);
QTreeWidgetItem *childItem = new QTreeWidgetItem();childItem->setText(0, QString("子項目"));topLevelItem->addChild(childItem);QTreeWidgetItem *childItem1 = new QTreeWidgetItem();childItem1->setText(0, QString("子項目1"));topLevelItem->addChild(childItem1);
topLevelItem->removeChild(childItem);
QTreeWidgetItem *removedItem = treeWidget->takeTopLevelItem(0);delete removedItem;
QTreeWidgetItem *childItem2 = new QTreeWidgetItem();childItem1->setText(1, QString("子項目2"));topLevelItem->addChild(childItem2);
一個demo:
?一個有兩種類型的QTreeWidgetItem:節點和名稱
可以添加節點,添加名稱,刪除,修改QTreeWidgetItem的名稱
右鍵彈出菜單
(根據右鍵的位置:分3種:1.點擊節點? ?2.點擊名稱 3.點擊空白處)
彈出相關的菜單按鈕
#ifndef MAINWINDOW1_H
#define MAINWINDOW1_H#include <QMainWindow>
#include <QMenu>
#include <QTreeWidget>
namespace Ui {
class MainWindow1;
}class MainWindow1 : public QMainWindow
{Q_OBJECTenum TreeItemType{none = 0,point = 1,name = 2};
public:explicit MainWindow1(QWidget *parent = 0);~MainWindow1();private slots:void on_actionAddPoint_triggered();void on_actionAddName_triggered();void PopMenu(QPoint);void on_actionDel_triggered();void on_actionChangeItemName_triggered();private:void setActionsState(bool addPoint,bool addName,bool del,bool changeName);void RemoveItem(QTreeWidgetItem *pItem);
protected:private:Ui::MainWindow1 *ui;int mPoint;int mName;QMenu* mMenu;
};#endif // MAINWINDOW1_H
#include "mainwindow1.h"
#include "ui_mainwindow1.h"
#include <QMouseEvent>
#include <QInputDialog>
#include <QDebug>
MainWindow1::MainWindow1(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow1)
{ui->setupUi(this);ui->treeWidget->setHeaderLabel("HeaderLabel");ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);connect(ui->treeWidget,&QTreeWidget::customContextMenuRequested,this,&MainWindow1::PopMenu);mMenu = new QMenu(this);mMenu->addAction(ui->actionAddPoint);mMenu->addAction(ui->actionAddName);mMenu->addAction(ui->actionDel);mMenu->addAction(ui->actionChangeItemName);mPoint = 0;mName = 0;}MainWindow1::~MainWindow1()
{delete ui;
}void MainWindow1::on_actionAddPoint_triggered()
{QTreeWidgetItem *Item = ui->treeWidget->currentItem();if(Item == nullptr){QStringList strList;strList<<QString("節點%1").arg(mPoint);QTreeWidgetItem* pItem = new QTreeWidgetItem(strList);pItem->setData(0,Qt::UserRole+1,TreeItemType::point);ui->treeWidget->addTopLevelItem(pItem);mPoint++;}else{QStringList strList;strList<<QString("節點%1").arg(mPoint);QTreeWidgetItem* pItem = new QTreeWidgetItem(strList);pItem->setData(0,Qt::UserRole+1,TreeItemType::point);Item->addChild(pItem);mPoint++;}
}void MainWindow1::on_actionAddName_triggered()
{QTreeWidgetItem *Item = ui->treeWidget->currentItem();if(Item == nullptr){QStringList strList;strList<<QString("名稱%1").arg(mName);QTreeWidgetItem* pItem = new QTreeWidgetItem(strList);pItem->setData(0,Qt::UserRole+1,TreeItemType::name);ui->treeWidget->addTopLevelItem(pItem);mName++;}else{QStringList strList;strList<<QString("名稱%1").arg(mName);QTreeWidgetItem* pItem = new QTreeWidgetItem(strList);pItem->setData(0,Qt::UserRole+1,TreeItemType::name);Item->addChild(pItem);mName++;}
}void MainWindow1::PopMenu(QPoint pos)
{QModelIndex index = ui->treeWidget->indexAt(pos);if(!index.isValid()){ui->treeWidget->setCurrentIndex(QModelIndex());}QTreeWidgetItem *pItem = ui->treeWidget->currentItem();if(nullptr == pItem){setActionsState(1,1,0,0);}else{TreeItemType type = (TreeItemType)pItem->data(0,Qt::UserRole+1).toInt();switch (type) {case TreeItemType::point:setActionsState(1,1,1,1);break;case TreeItemType::name:setActionsState(0,0,1,1);break;default:break;}qDebug()<<pItem->text(0).toStdString().c_str();}mMenu->exec(QCursor::pos());
}void MainWindow1::on_actionDel_triggered()
{QTreeWidgetItem *pItem = ui->treeWidget->currentItem();if(nullptr == pItem){}else{RemoveItem(pItem);}
}void MainWindow1::on_actionChangeItemName_triggered()
{QTreeWidgetItem *pItem = ui->treeWidget->currentItem();TreeItemType type = (TreeItemType)pItem->data(0,Qt::UserRole+1).toInt();QString str;switch (type) {case TreeItemType::point:str="節點";break;case TreeItemType::name:str="名稱";break;default:break;}QInputDialog dialog;dialog.exec();pItem->setData(0,Qt::DisplayRole,str+dialog.textValue());
}void MainWindow1::setActionsState(bool addPoint, bool addName, bool del, bool changeName)
{ui->actionAddPoint->setVisible(addPoint);ui->actionAddName->setVisible(addName);ui->actionChangeItemName->setVisible(changeName);ui->actionDel->setVisible(del);
}void MainWindow1::RemoveItem(QTreeWidgetItem *pItem)
{int nChildCount = pItem->childCount();if(nChildCount == 0){delete pItem;pItem = nullptr;return ;}for(int i = 0; i < nChildCount; ++i){QTreeWidgetItem *pTmp = pItem->child(0);RemoveItem(pTmp);}delete pItem;pItem = nullptr;
}