QT实现拖放文件(有例子,并且图文并茂,非常清楚)

转自:http://my.oschina.net/voler/blog/345722

目录[-]

0. 源代码下载地址

1. 简单文件拖放

https://github.com/leichaojian/qt/tree/master/drop1

2. 复杂文件拖放

https://github.com/leichaojian/qt/tree/master/drop

3. 通过按钮来完成列表数据的转移

https://github.com/leichaojian/qt/tree/master/drop3

4. 通过拖放文件来达到效果

https://github.com/leichaojian/qt/tree/master/drop4

1. 简单文件拖放

1. 一般情况下,编辑框可以直接接收到文件名

?


1

2

3

4

5

6

7

8

MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    textEdit = new QTextEdit;

    setCentralWidget(textEdit);

}

2. 程序效果图

2. 复杂文件拖放

如果我们想在主框架中得到响应的文件信息,则我们必须亲自实现文件拖放操作。

1. 关键代码如下

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

//当用户拖动文件到窗口部件上时候,就会触发dragEnterEvent事件

void MainWindow::dragEnterEvent(QDragEnterEvent *event)

{

    //如果为文件,则支持拖放

    if (event->mimeData()->hasFormat("text/uri-list"))

        event->acceptProposedAction();

}

//当用户放下这个文件后,就会触发dropEvent事件

void MainWindow::dropEvent(QDropEvent *event)

{

    //注意:这里如果有多文件存在,意思是用户一下子拖动了多个文件,而不是拖动一个目录

    //如果想读取整个目录,则在不同的操作平台下,自己编写函数实现读取整个目录文件名

    QList<QUrl> urls = event->mimeData()->urls();

    if(urls.isEmpty())

        return;

    //往文本框中追加文件名

    foreach(QUrl url, urls) {

        QString file_name = url.toLocalFile();

        textEdit->append(file_name);

    }

}

2. 程序效果图

3. 通过按钮来完成列表数据的转移

1. 关键代码

?


1

2

3

4

5

6

7

8

9

10

void Dialog::moveCurrentItem(QListWidget *source,

                     QListWidget *target)

{

    if (source->currentItem()) {

        QListWidgetItem *newItem = source->currentItem()->clone();

        target->addItem(newItem);

        target->setCurrentItem(newItem);

        delete source->currentItem();

    }

}

2. 程序效果图

4. 通过拖放文件来达到效果

1. 关键代码

?


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

void ProjectListWidget::mousePressEvent(QMouseEvent *event)

{

    //获取鼠标按下时候的坐标

    if (event->button() == Qt::LeftButton)

        startPos = event->pos();

    QListWidget::mousePressEvent(event);

}

void ProjectListWidget::mouseMoveEvent(QMouseEvent *event)

{

    if (event->buttons() & Qt::LeftButton) {

        int distance = (event->pos() - startPos).manhattanLength();

        //如果长度大于推荐的拖动起始距离,则认为是拖动(存在用户手抖的情况)

        if (distance >= QApplication::startDragDistance())

            performDrag();

    }

    QListWidget::mouseMoveEvent(event);

}

//有文件拖动到窗口上时,触发此dragEnterEvent事件

void ProjectListWidget::dragEnterEvent(QDragEnterEvent *event)

{

    //当为同一个应用程序的一部分时,event->source()返回启动这个拖动窗口部件的指针

    ProjectListWidget *source =

            qobject_cast<ProjectListWidget *>(event->source());

    if (source && source != this) {

        //确认是一个移动的操作

        event->setDropAction(Qt::MoveAction);

        event->accept();

    }

}

void ProjectListWidget::dragMoveEvent(QDragMoveEvent *event)

{

    ProjectListWidget *source =

            qobject_cast<ProjectListWidget *>(event->source());

    if (source && source != this) {

        event->setDropAction(Qt::MoveAction);

        event->accept();

    }

}

void ProjectListWidget::dropEvent(QDropEvent *event)

{

    ProjectListWidget *source =

            qobject_cast<ProjectListWidget *>(event->source());

    if (source && source != this) {

        //得到数据并增加到列表中

        addItem(event->mimeData()->text());

        event->setDropAction(Qt::MoveAction);

        event->accept();

    }

}

void ProjectListWidget::performDrag()

{

    //当前被拖动的选项

    QListWidgetItem *item = currentItem();

    if (item) {

        QMimeData *mimeData = new QMimeData;

        mimeData->setText(item->text());

        QDrag *drag = new QDrag(this);

        drag->setMimeData(mimeData);

        drag->setPixmap(QPixmap(":/images/person.png"));

        //进行拖动操作

        if (drag->exec(Qt::MoveAction) == Qt::MoveAction)

            delete item;

    }

}

2. 效果图(通过鼠标拖放)

http://blog.csdn.net/emdfans/article/details/41721955

时间: 2025-01-06 15:02:57

QT实现拖放文件(有例子,并且图文并茂,非常清楚)的相关文章

用Qt读取xml文件,程序执行到 if(!doc.setContent(&amp;file)) 时候出错

看霍亚飞的那本<Qt Creator快速入门>,然后就照着写那个DOM方式读取xml文件的例子出这样的错误. 一开始大家都以为自己的路径会有问题,其实在之前open的时候没问题,怎么可能到后面这里才出问题呢?(自己也在这里绕了很多弯弯) 通过其他方式了解这个函数的原理,其实就是创建一个树,将xml格式的数据保存到一个树一样结构的doc里面去.也就是说,我们在创建这个树的时候出错了,定位一下就知道自己的XML文件是不是错了. 换一个xml,网上下下吧,比较一下发现,原来第一行的<?xml 

Qt之拖放

Qt之 拖放(drag 和 drop) 拖放是应用程序内或者应用程序之间数据传递的一种方式.通常是提供数据的复制和移动.拖放主要包括拖动和放下.有些窗口可能只需要提供拖动功能,有些窗口可能只需要放下,有些窗口可能两者功能都需要具备.Qt的一些控件不需要进行任何设置,就具备拖放功能,比如QLineEdit.QTextEdit. QLineEdit可以接受拖动过来的字符串,而QTextEdit可以接受拖动的字符串以及拖动文件的路径.所需要做的就是创建一个对象,然后显示,如下: QLineEdit l

Qt 如何处理拖放应用程序参数时,中国

你用 Qt 我们开发的应用程序.用户拖放文件到您的 exe 在.启动应用程序,在这个时候, main() 功能参数可以接收中国.如何正确处理它?非常easy,码如下面: QTextCodec *codec = QTextCodec::codecForLocale(); QString arg = codec->toUnicode(argv[i]); 拖放时传递给应用的參数.是依照系统本地编码格式编码的. QTextCodec 的 codecForLocale() 会返回系统本地的 codec ,

Qt中 .pro 文件和 .pri 文件简介

*.pro 这是一个典型的Qt示例程序的.pro文件(propriprfprl.pro): TEMPLATE = app CONFIG += QT QT += core gui TARGET = propriprfprl SOURCES += main.cpp/ widget.cpp HEADERS += widget.h FORMS += widget.ui 前面3行是qmake的默认值,我们都可以省略 TARGET 这行指定工程名,我们也可以省略 *.pri i 是什么东西?包含(inclu

Qt之UI文件设计和运行机制

1.项目文件组成在QtCreator中新建一个WidgetApplocation项目,选中窗口基类中选中QWidget作为窗口基类,并选中"GnerateForm"复选框.创建后项目文件目录树如图: 项目组织文件pro:存储项目设置的文件主程序入口文件main.cpp,实现main函数的程序文件窗体界面文件widget.ui:一个XML格式存储的窗体上的文件以及其布局的文件widget.h是所设计的窗口类的头文件,widget.cpp是widget.h里定义类的实现文件.在C++里面,

QT基础(五)QT工程pro文件模板变量 使用

QT工程pro文件模板变量(TEMPLATE)模板变量告诉qmake为这个应用程序生成哪种makefile.下面是可供使用的选择: app - 建立一个应用程序的makefile.这是默认值,所以如果模板没有被指定,这个将被使用. lib - 建立一个库的makefile. vcapp - 建立一个应用程序的Visual Studio项目文件. vclib - 建立一个库的Visual Studio项目文件. subdirs - 这是一个特殊的模板,它可以创建一个能够进入特定目录并且为一个项目文

[转]Qt中ui文件的使用

用designer设计的*.ui文件可以通过uic工具转换为*.h文件(在编译时也会自动生成这样一个ui_*.h文件),有了这个.h文件就可以直接按照纯C++的方式对其中的类进行调用.ui文件的使用就是利用默认工具uic自动产生一个类,然后用该类的setui函数加载界面到相应的对象上.       .ui文件的使用有三种形式:第一种是直接使用,第二种是定义一个新类,声明一个ui子对象,利用该对象来加载界面,第三种是将ui作为基类派生新的类. 借用一个例程分析如下: 工程及界面          

Qt的翻译文件QTranslator不能使用问题总结(原)

笔者今天在自己工程中使用翻译文件,发现没有起作用,反复查找,发现是用宏定义了命名空间,生成.ts文件时,不会加上命名空间,所以生成的.qm文件在实际使用时,会无法找到对应的语句. 如果将宏定义的命名空间修改为普通字符,则没有上述问题. 刚才是namespace MyProject{ 是用#define USNS namespace MyProject{定义好宏,直接使用宏的,所以生成文件,不能自己将宏转换导致 总结一下翻译碰到要注意的几个问题: 1,基本使用 QTextCodec * textC

qt学习(一)qt三个文件函数的框架

学到点什么, 而不是复制着什么, 每天敲着别人给的代码,苦涩得改完bug, 就这样一天天的过去, 实质上并没有学到什么, 别人的思想只是拿来借鉴, 你的思想是好是坏都是你的, 不用急着抛弃自己. 从qt看看人家的思路. Qt编程思路: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~` 以下:xxx.h ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~