QT拖拽文件、文件夹及遍历文件夹简单案例

首先是实现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

本文链接:QT拖拽文件、文件夹及遍历文件夹简单案例

转载声明:BeiTown原创,转载请注明来源:BeiTown's Coder 编码之源,谢谢


Tags: , ,

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>