文档章节

跟我一起学QT7:拖放文件

fzyz_sb
 fzyz_sb
发布于 2014/11/17 23:05
字数 704
阅读 5942
收藏 14

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. 一般情况下,编辑框可以直接接收到文件名

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    textEdit = new QTextEdit;
    setCentralWidget(textEdit);
}



2. 程序效果图


2. 复杂文件拖放

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

1. 关键代码如下

//当用户拖动文件到窗口部件上时候,就会触发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. 关键代码

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. 关键代码

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. 效果图(通过鼠标拖放)


© 著作权归作者所有

fzyz_sb
粉丝 411
博文 209
码字总数 447144
作品 0
武汉
程序员
私信 提问
加载中

评论(1)

justin_jxz
justin_jxz
我实际应用中有个问题,由于别的特殊因素,程序需要管理员模式运行,而这时程序就没办法拖放文件了,这种情况应该如何解决?
关于拖放与Shift和Ctrl的应用

拖放功能: 我们在拖放源中选中一项或多项元素,然后用鼠标将这些元素脱离它们的初始位置,当拖着这些元素在拖放目标上松开鼠标键时, 拖放目标将会查询拖放源,进而访问到这些元素的相关信息...

freeframe
2013/04/11
0
0
拖放技术一

拖放 Drag and Drop,有时又被称为 DnD,是现代软件开发中必不可少的一项技术。它提供了一种能够在应用程序内部甚至是应用程序之间进行信息交换的机制,并且,操作系统与应用程序之间进行剪贴...

晨曦之光
2012/04/13
127
0
【Qt笔记】使用拖放

拖放(Drag and Drop),通常会简称为 DnD,是现代软件开发中必不可少的一项技术。它提供了一种能够在应用程序内部甚至是应用程序之间进行信息交换的机制。操作系统与应用程序之间进行的剪贴...

大道无名
2016/08/02
68
0
Qt 学习之路 2(52):使用拖放

拖放(Drag and Drop),通常会简称为 DnD,是现代软件开发中必不可少的一项技术。它提供了一种能够在应用程序内部甚至是应用程序之间进行信息交换的机制。操作系统与应用程序之间进行的剪贴...

SuShine
2016/05/12
85
0
Unity2018新功能抢先预览 | Preset功能

本文首发于“洪流学堂”微信公众号。 洪流学堂,让你学Unity快人几步 Presets(预设) Preset是Unity2018的新功能。 Preset是保存对象属性的资源。Preset存储在项目的Project文件夹中,使用....

zhenghongzhi6
2018/04/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

好程序员web前端分享逻辑运算

  一门计算机语言,编程的核心在于逻辑思想,当我们在编写程序的时候,逻辑是否通顺,是能否正确写出程序的关键,可以说如果你掌握了逻辑,那么你就踏入了计算机编程的大门。 &&与 || 或 ...

好程序员IT
34分钟前
2
0
我的Linux系统开始学习的过程

我的Linux系统开始学习的过程 Linux系统,不知大家是否了解。接触计算机不多或对计算机不感冒的人可能对其比较陌生,曾经的我也是。上大学前的我的确对Linux一无所知,那时候接触面窄,都没有...

linuxCool
35分钟前
1
0
让自己的网站可以被搜索

第一步:先注册一个属于自己的域名,这个域名是独一无二的。推荐到主机屋注册一个,其实在哪里注册都是一样的,但是主机屋提供免费的地址解析服务(只对在主机屋注册的域名免费)。 主机屋官...

WinkJie
37分钟前
4
0
全站加速(DCDN)- IP应用加速产品解读

5月22日下午15点,阿里云全站加速(DCDN)-IP应用加速如期发布。IP应用加速是阿里云自主研发的一款更高效、更安全、更便捷的动态加速产品,结合阿里云CDN本身的资源优势,利用就近接入、智能...

阿里云官方博客
40分钟前
1
0
k8s常用命令

1.创建deployment资源kubectl apply -f nginx.yml2.删除deployment资源kubectl delete -f nginx.yml3.查看deployment资源基本信息deployment资源(运行的服务资源)kubectl get...

平头哥-Enjoystudy
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部