首先是实现QT的窗体拖拽功能将文件拖拽进入Mainwindow,需要实现代码如下:
1 2 3 4 5 6 7 | MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); setAcceptDrops(true);//将Mainwindow设置成可相应拖拽事件 } |
这里的 setAcceptDrops(true); 将Mainwindow设置成可相应拖拽事件,接下来,重载dragEnterEvent和dropEvent方法,实现对拖拽内容的判断和操作,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | //拖入Mainwindow时触发 void MainWindow::dragEnterEvent(QDragEnterEvent *event){ if(event->mimeData()->hasUrls()) { foreach(QUrl url, event->mimeData()->urls()) { if(!url.isEmpty()) event->accept();//界面反馈表示可拖拽 } return; } else { event->ignore();//界面反馈表示不可拖拽 } } //松开鼠标后触发 void MainWindow::dropEvent(QDropEvent *event) { if(event->mimeData()->hasUrls()) { foreach(QUrl url, event->mimeData()->urls()) { QFileInfo fileInfo(url.toString()); QString filePath = fileInfo.filePath().remove(0, QDir::currentPath().size() + 9); if(fileInfo.fileName().contains(".")){//根据是否带"."判断是否是文件夹 //属于文件 }else{ //属于文件夹 FindFile(filePath);//遍历文件夹递归函数 } } return; } return; } |
以上代码实现了同时拖入多个文件,及文件文件夹混合拖入。
接下来将对我们拖入的文件夹进行遍历,详见代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | bool MainWindow::FindFile(const QString & path) { QDir dir(path); if (!dir.exists()) return false; dir.setFilter(QDir::Dirs|QDir::Files);//设置过滤器 dir.setSorting(QDir::DirsFirst);//排序 QFileInfoList list = dir.entryInfoList();//获得文件列表 for (int i = 0; i < list.size(); i++) { QFileInfo fileInfo = list.at(i); if(fileInfo.fileName()=="." || fileInfo.fileName()=="..") continue; if (fileInfo.fileName().contains("."))//根据是否带"."判断是否是文件夹 { qDebug()<<fileInfo.filePath() + fileInfo.fileName(); } else { FindFile(fileInfo.filePath()); } } } |
以上即实现了QT对文件、文件夹混合拖入的操作,以及文件夹的遍历。结合以上代码即可开发更多的相关应用。
本篇到此,欢迎大家提出更好的解决方案,比如说对于是否是文件夹的判定,是否有比if(fileInfo.fileName().contains(“.”))更合适的方法。
之前尝试调用fileInfo.isDir()无效,望更多交流指针。谢谢关注。
BeiTown
2014.09.19