文件系統交互實現

關于之前的搭建看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;}
}

源碼已上傳,大家先看看代碼吧,代碼都有注釋,后面我慢慢完善

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81185.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81185.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81185.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[ctfshow web入門] web75

信息收集 啟用了open_basedir&#xff0c;所以之前的方法又不能用了 解題 cforeach(new DirectoryIterator("glob:///*") as $a){echo($a->__toString(). ); } ob_flush();cif ( $a opendir("glob:///*") ) {while ( ($file readdir($a)) ! false …

Vulfocus靶場-文件上傳-3

WSO2 文件上傳 &#xff08;CVE-2022-29464&#xff09; WSO2是一家成立于 2005 年的開源技術提供商。它提供了一個企業平臺&#xff0c;用于在本地和整個 Internet 上 集成應用程序編程接口(API)、應用程序和 Web 服務。 某些 WSO2 產品允許無限制的文件上傳和遠程代碼執行。…

基于MCP的橋梁設計規范智能解析與校審系統構建實踐

引言 今天本文準備盤一個大活&#xff0c;聊一聊偏特定行業一點的AI技術深入應用思考及實踐。 一、傳統設計行業項目背景與行業痛點 在橋梁設計領域&#xff0c;標準規范是設計的基礎&#xff0c;直接關系到橋梁結構的安全性、耐久性和經濟性。然而&#xff0c;傳統的規范應…

遠程連接電腦的方法?異地遠程桌面連接和三方軟件實現

遠程連接電腦&#xff0c;是指通過網絡技術&#xff0c;在一臺設備上操控另一臺設備的電腦桌面&#xff0c;實現跨地域的操作和管理。在日常工作、技術支持、遠程辦公等場景中&#xff0c;遠程連接電腦都發揮著重要作用。實現遠程連接電腦主要有系統自帶工具和第三方軟件兩種方…

win11 安裝 wsl ubuntu 18.04后換源失敗!

記錄幾個問題是如何解決的。 一 下載wsl后&#xff0c;有報錯&#xff1a; Installing, this may take a few minutes... WslRegisterDistribution failed with error: 0x8007019e Error: 0x8007019e ??????? Linux ? Windows ???? Press any key to continue... …

PY32系列單片機離線燒錄器,可配置選項字節和上機臺批量燒錄

PY32離線燒錄器采用 MINI-USB 接口&#xff0c;提供穩定的物理連接。設備與電腦采用串口方式通訊&#xff0c;波特率固定為 1M。需配合我們的上位機使用。PY32離線燒錄器現支持芯片型號在PY32F002A/002B/002/003/030/071/072/040/403/303各封裝和XL32F001/003。燒錄器僅提供 3.…

深入理解 this 指向與作用域解析

引言 JavaScript 中的 this 關鍵字的靈活性既是強大特性也是常見困惑源。理解 this 的行為對于編寫可維護的代碼至關重要&#xff0c;但其動態特性也會讓我們感到困惑。 與大多數編程語言不同&#xff0c;JavaScript 的 this 不指向函數本身&#xff0c;也不指向函數的詞法作…

# IntelliJ IDEA企業版開發入門:包、類與項目結構詳解

--- ## 一、項目結構與包的概念 ### 1. 標準項目目錄解析 在IntelliJ IDEA中&#xff0c;一個Java項目通常包含以下核心目錄&#xff1a; - **src**&#xff1a;源代碼根目錄。 - **main**&#xff1a;主代碼目錄&#xff0c;存放業務邏輯代碼。 - **java**&#xff1a;Java…

NGINX 開源與社區動態:從基石到浪潮,持續演進的生態力量

NGINX 之所以能夠成為全球應用最為廣泛的 Web 服務器和反向代理軟件之一,其成功的核心驅動力無疑是開源。開放的源代碼、活躍的社區參與以及透明的開發過程,共同鑄就了 NGINX 的輝煌。然而,正如所有大型開源項目一樣,NGINX 的開源之路也并非一帆風順,其社區動態也時常涌現…

Electron(一)

前言&#xff1a; 參考尚硅谷視頻記錄&#xff1a;b站尚硅谷視頻-1小時上手electron 一、什么是electron? 是一款應用廣泛的、跨平臺的、桌面應用開發框架。 應用廣泛&#xff1a;很多桌面應用都是這個框架寫的&#xff0c;例如騰訊qq、百度云跨平臺&#xff1a;跨window、…

AI Agent開發第64課-DIFY和企業現有系統結合實現高可配置的智能零售AI Agent(上)

開篇 我們之前花了將近10個篇章講Dify的一些基礎應用,包括在講Dify之前我們講到了幾十個AI Agent的開發例子,我不知道大家發覺了沒有,在AI Agent開發過程中我們經常會伴隨著這樣的一些問題: 需要經常改貓娘;需要經常改調用LLM的參數,甚至在一個流程中有3個節點,每個節點…

ssti刷刷刷

[NewStarCTF 公開賽賽道]BabySSTI_One 測試發現過濾關鍵字&#xff0c;但是特殊符號中括號、雙引號、點都能用 可以考慮拼接或者編碼&#xff0c;這里使用拼接 ?name{{()["__cla"~"ss__"]}}?name{{()["__cla"~"ss__"]["__ba&…

google-Chrome常用插件

google-Chrome常用插件 1. json格式化展示插件 github下載jsonview-for-chrome插件 通過離線安裝方式 拓展程序-》管理拓展程序-》打開開發者模式-》加載已解壓的拓展程序-》選擇拓展程序解壓的位置 2. 翻譯插件 插件下載地址&#xff1a;Immersive Translate - Bilingual …

基于redis實現分布式鎖方案實戰

分布式鎖的進階實現與優化方案 作為Java高級開發工程師&#xff0c;我將為您提供更完善的Redis分布式鎖實現方案&#xff0c;包含更多生產級考量。 1. 生產級Redis分布式鎖實現 1.1 完整實現類&#xff08;支持可重入、自動續約&#xff09; import redis.clients.jedis.Je…

XML簡要介紹

實際上現在的Java Web項目中更多的是基于springboot開發的&#xff0c;所以很少再使用xml去配置項目。所以我們的目的就是盡可能快速的去了解如何讀懂和使用xml文件&#xff0c;對于DTD&#xff0c;XMLSchema這類約束的學習可以放松&#xff0c;主要是確保自己知道這里面的大致…

UI自動化測試中,一個完整的斷言應所需要考慮的問題

在UI自動化測試中,一個完整的斷言應全面覆蓋用戶界面(UI)的功能性、交互性和視覺正確性。以下是斷言需要包含的核心內容及詳細說明: 一、基礎元素驗證 存在性斷言 驗證元素存在于DOM中示例代碼(Python + Selenium):assert driver.find_element(By.ID, "submit_btn&…

[Java][Leetcode middle] 238. 除自身以外數組的乘積

第一個想法是&#xff1a; 想求出所有元素乘積&#xff0c;然后除以i對應的元素本書&#xff1b;這個想法是完全錯誤的&#xff1a; nums[I] 可能有0題目要求了不能用除法 第二個想法是&#xff1a; 其實寫之前就知道會超時&#xff0c;但是我什么都做不到啊&#xff01; 雙…

5.16本日總結

一、英語 背誦list30&#xff0c;復習list1 二、數學 學習14講部分內容&#xff0c;訂正30講13講題目 三、408 學習計網5.3知識點&#xff0c;完成5.1&#xff0c;5.2題目并訂正 四、總結 高數對于基本定義概念類題目掌握不好&#xff0c;做題時往往不會下手&#xff0c…

深度學習---常用優化器

優化器一&#xff1a;Adam&#xff08;Adaptive Moment Estimation&#xff09; 一、適用場景總結&#xff08;實踐導向&#xff09; 場景是否推薦用 Adam說明小模型訓練&#xff08;如 MLP、CNN&#xff09;???穩定、無需復雜調參&#xff0c;適合快速實驗初學者使用或結構…

SparkSQL 連接 MySQL 并添加新數據:實戰指南

SparkSQL 連接 MySQL 并添加新數據&#xff1a;實戰指南 在大數據處理中&#xff0c;SparkSQL 作為 Apache Spark 的重要組件&#xff0c;能夠方便地與外部數據源進行交互。MySQL 作為廣泛使用的關系型數據庫&#xff0c;與 SparkSQL 的結合可以充分發揮兩者的優勢。本文將詳細…