關于之前的搭建看QT控件文件系統的實現-CSDN博客,接下來是對本程序的功能完善,我想著是這樣設計的,打開一個目錄以后,鼠標選中一個項可以是目錄,也可以是文件,右鍵可以出現一個菜單選擇操作,比如刪除,重命名,新建文件等。
新添頭文件
#include<QAction>
#include<QMenu>
#include<QString>
#include<QModelIndex>
#include<QFileInfo>
#include<QMessageBox>
#include<QInputDialog>
成員變量
QMenu *menu;//右鍵菜單QAction *deldir;//刪除操作QAction *newdir;//新建文件夾QAction *newfile;//新建文件QAction *renamefile;//重命名文件QString filepath;//當前操作所在的目錄地址QModelIndex selectindex;//當前選中的項bool hasopen=false;//只有打開過才可以觸發菜單
槽函數
void onmenu(const QPoint &pos);//右鍵菜單欄void deleteSelect();//刪除目錄void renameselect();//重命名文件void createfileincurrentdir();//在當前目錄下新建文件void createFolderincurrentdir();//在當前目錄下新建目錄
?主程序
在主程序里面首先就是創建菜單欄,創建愛了許多action,但是我這菜單中的選中分為目錄和文件,在不同的地方選中可使用的action有些不同,執行的邏輯就是首先判斷有沒有打開過目錄,沒有打開過就掛掉,打開過判斷當前索引是否有效,如果有效選中的是目錄還是文件,如果無效如果是空文件夾下就設置相應的action。具體程序如下
void MainWindow::onmenu(const QPoint &pos)
{//如果沒有打開過目錄不觸發if(hasopen==false){return;}//QAction初始化deldir=new QAction("刪除",this);newdir=new QAction("新建文件夾",this);//新建文件夾newfile=new QAction("新建文件",this);//新建文件renamefile=new QAction("重命名文件",this);//重命名文件//獲取當前選中項索引selectindex=ui->treeView->indexAt(pos);//if(!selectindex.isValid()){return;}menu->clear();filepath=model->filePath(selectindex);// 判斷是否有效索引if (selectindex.isValid()) {filepath = model->filePath(selectindex);// 根據文件類型添加菜單項if (model->isDir(selectindex)) {menu->addAction(deldir);menu->addAction(newdir);menu->addAction(newfile);} else {menu->addAction(deldir);menu->addAction(renamefile);}}// 無效索引時(空文件夾空白處)else {// 獲取當前視圖的根目錄路徑filepath = model->rootPath();if(filepath.isEmpty()){filepath=QDir::homePath();}// 添加新建操作menu->addAction(newdir);menu->addAction(newfile);}connect(deldir,&QAction::triggered,this,&MainWindow::deleteSelect);connect(newdir,&QAction::triggered,this,&MainWindow::createFolderincurrentdir);connect(newfile,&QAction::triggered,this,&MainWindow::createfileincurrentdir);connect(renamefile,&QAction::triggered,this,&MainWindow::renameselect);
//?menu->exec(ui->treeView->viewport()->mapToGlobal(pos));
}
然后就是槽函數的具體實現了
void MainWindow::deleteSelect()
{QString path=model->filePath(selectindex);QFileInfo fileinfo(path);QString title=fileinfo.isDir()?"刪除目錄":"刪除文件";QString question=fileinfo.isDir()?"確定要刪除目錄和該目錄下所有文件?":"確定要刪除該文件?";QMessageBox::StandardButton reply=QMessageBox::question(this,title,question,QMessageBox::Yes|QMessageBox::No);if(reply==QMessageBox::Yes){bool success=fileinfo.isDir()?QDir(path).removeRecursively():QFile::remove(path);if(!success){QMessageBox::critical(this,"錯誤","刪除失敗,請檢查權限或以管理員身份運行");}}
}//重命名文件
void MainWindow::renameselect()
{if(model->isDir(selectindex)){return;}//彈窗輸入新文件名bool ok;QString newfilename=QInputDialog::getText(this,"重命名文件","請輸入新文件名:",QLineEdit::Normal,model->fileName(selectindex),&ok);//如果修改了并且新的文件名不為空if(ok&&!newfilename.isEmpty()){QDir dir=model->fileInfo(selectindex).dir();QString oldpath=model->filePath(selectindex);QString newpath=dir.absoluteFilePath(newfilename);if(!QFile::rename(oldpath,newpath)){qDebug()<<"重命名失敗!";}}}//在當前目錄下創建文件
void MainWindow::createfileincurrentdir()
{bool ok;QString filename=QInputDialog::getText(this,"新建文件","請輸入新文件文件名:",QLineEdit::Normal,"",&ok);if(!ok||filename.isEmpty()){return;}//新建文件QFile file(QDir(filepath).filePath(filename));if(!file.open(QIODevice::WriteOnly)){QMessageBox::critical(this,"錯誤","創建文件失敗,請檢查文件名或權限");return;}file.close();
}//在當前目錄下創建文件夾
void MainWindow::createFolderincurrentdir()
{bool ok;QString dirname=QInputDialog::getText(this,"新建目錄","請輸入新建的目錄名:",QLineEdit::Normal,"",&ok);if(!ok||dirname.isEmpty()){return;}QDir dir(filepath);if(!dir.mkdir(dirname)){QMessageBox::critical(this,"錯誤","目錄創建失敗");return;}
}
源碼已上傳,大家先看看代碼吧,代碼都有注釋,后面我慢慢完善