1、new 一個QTreeWidget 對象,並設置頭標簽,和根節點(個人程序需要)
QTreeWidget* treeWidget = ui.treeWidget;//我已經在ui設計師中拖了一個QTreeWidget QString headers; headers = "Name" ; treeWidget->setHeaderLabel(headers); QStringList rootText; rootText << "wells"; root = new QTreeWidgetItem(treeWidget, rootText);
2、添加 QTreeWidgetItem(這里是讀取文件夾里文件的名字作為item的名字)
for(int i = 2;i < fileList.size();i++) { QTreeWidgetItem *leaf = new QTreeWidgetItem(root, QStringList() <<fileList.at(i).fileName()); leaf->setFlags(leaf->flags() | Qt::ItemIsEditable); root->addChild(leaf); }
3、點擊item事件
connect(treeWidget,SIGNAL(itemClicked(QTreeWidgetItem*,int)), this,SLOT(checkself(QTreeWidgetItem* ,int)));//檢測點擊事件,信號槽機制
4、checkself(QTreeWidgetItem* ,int);函數是點擊后的響應函數。在private slot: 下聲明(這里的具體實現就不貼了)
5、右鍵彈出菜單
connect(treeWidget,SIGNAL(customContextMenuRequested(const QPoint&)), this,SLOT(popMenu(const QPoint&)));//檢測鼠標右鍵
6、彈出菜單的響應函數 popMenu(const QPoint&)
void LWD::popMenu(const QPoint&) { QTreeWidgetItem* curItem=treeWidget->currentItem(); //獲取當前被點擊的節點 if(curItem==NULL)return; //這種情況是右鍵的位置不在treeItem的范圍內,即在空白位置右擊 QString wellName = curItem->text(0); if(wellName != "wells") { QAction deleteWell(QString::fromLocal8Bit("&刪除該井"),this);//刪除井 QAction reNameWell(QString ::fromLocal8Bit("&重命名井"),this);//重命名井 //在界面上刪除該item connect(&deleteWell, SIGNAL(triggered()), this, SLOT(deleteItem())); connect(&reNameWell,SIGNAL(triggered()),this,SLOT(renameWell())); QPoint pos; QMenu menu(ui.treeWidget); menu.addAction(&deleteWell); menu.addAction(&reNameWell); menu.exec(QCursor::pos()); //在當前鼠標位置顯示 } }
7、deleteItem()
void LWD::deleteItem() { root->removeChild(treeWidget->currentItem()); if(myW != NULL) { myW->setParent(NULL); ui.verticalLayout_4->removeWidget(myW); } //刪除井數據文件 QString dirPath = "../Data1/"; dirPath.append(treeWidget->currentItem()->text(0)); dirPath.append("/"); DeleteDirectory(dirPath);//實現在下面 } bool LWD::DeleteDirectory(const QString &path) { if (path.isEmpty()) return false; QDir dir(path); if(!dir.exists()) return true; dir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot); QFileInfoList fileList = dir.entryInfoList(); foreach (QFileInfo fi, fileList) { if (fi.isFile()) fi.dir().remove(fi.fileName()); else DeleteDirectory(fi.absoluteFilePath()); } return dir.rmpath(dir.absolutePath()); }
8、renameWell()
void LWD::renameWell() { preName = treeWidget->currentItem()->text(0); prePath = "../Data1/"; prePath.append(preName); ui.treeWidget->editItem(ui.treeWidget->currentItem()); //t通過監控itemChanged事件來確定修改后的名字!!!! connect(treeWidget,SIGNAL(itemChanged( QTreeWidgetItem *,int )),this,SLOT(nameChanged(QTreeWidgetItem* ))); } void LWD::nameChanged(QTreeWidgetItem* item) { //先重命名文件夾 QString newName = treeWidget->currentItem()->text(0); QString newPath = "../Data1/"; newPath.append(newName); QFile::rename(prePath,newPath); prePath = newPath.append("/"); prePath.append(preName); prePath.append(".txt"); //重命名井眼軌跡處理后的文件 newPath.append("/"); newPath.append(newName); newPath.append(".txt"); QFile::rename(prePath,newPath); }