这里会直接给出Demo代码,做简单讲解。
开发环境VS2013 Qt5.8
先给出头文件代码如下:
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 |
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QListWidget> #include <QtGui> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); protected: void dragEnterEvent(QDragEnterEvent* event = NULL); void dropEvent(QDropEvent* event = NULL); private: QFileInfoList GetAllFileList(QString filePath); private: QListWidget* listWidget; }; #endif // MAINWINDOW_H |
然后是实现代码如下:
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
#include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { listWidget = new QListWidget(); //创建textEdit setCentralWidget(listWidget); //设置为中央窗口部件 listWidget->setAcceptDrops(false); //设置textEdit禁用拖动 setAcceptDrops(true); //设置窗口启用拖动 setWindowTitle(tr("Load File")); } MainWindow::~MainWindow() { } void MainWindow::dragEnterEvent(QDragEnterEvent* event) { if(event->mimeData()->hasFormat("text/uri-list")) { event->acceptProposedAction(); } } void MainWindow::dropEvent(QDropEvent* event) { //窗口部件放下一个对象时,调用该函数 QList<QUrl> urls = event->mimeData()->urls(); if(urls.isEmpty()) { return; } QList<QUrl>::iterator it; for(it = urls.begin(); it != urls.end(); it++) { QUrl url = *it; QFileInfo fileInfo(it->toLocalFile()); if(fileInfo.isFile()) { //是文件就直接加进来 listWidget->addItem(fileInfo.filePath()); } else if(fileInfo.isDir()) { //文件路径就循环读取 QFileInfoList fileInfoList = GetAllFileList(fileInfo.filePath()); for(QFileInfo fileInfo1 : fileInfoList) { listWidget->addItem(fileInfo1.filePath()); } } } } //循环读取文件路径,后期可以考虑换成多线程-线程池来做. QFileInfoList MainWindow::GetAllFileList(QString path) { QDir dir(path); QFileInfoList file_list = dir.entryInfoList(QDir::Files | QDir::Hidden | QDir::NoSymLinks); QFileInfoList folder_list = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); for(int i = 0; i != folder_list.size(); i++) { QString name = folder_list.at(i).absoluteFilePath(); QFileInfoList child_file_list = GetAllFileList(name); file_list.append(child_file_list); } return file_list; } |
以上就是实现代码。
拖放操作包括两个截然不同的动作:拖动、放下。Qt的窗口部件可以作为拖动点,也可以作为放下点,或者两者都是。
上面的MainWindow类实现了QWidget的dragEnterEvent() 和 dropEvent()函数。
当用户把一个对象拖动到窗口部件上时,就会调用dragEnterEvent()函数。如果对这个事件调用acceptProposedAction(),就表明用户可以在这个窗口部件上拖放对象。当然,默认情况下,窗口是不接受拖动的。Qt会自动改变光标来向用户说明这个窗口部件是不是有效的放下点。
当用户在窗口部件上放下一个对象时,就会调用DropEvent()。我们调用函数QMineData::urls()来获得QUrl列表。
QWidget也提供dragMoveEvent()和dragLeaveEvent()两个函数,不过在绝大多数应用程序中不需要实现他们。
大致就这些,这是比较简单的。
【Qt】拖拽导入文件,递归导入文件夹的实现