Qt5文件拖放学习

  • Post author:
  • Post category:其他




文件拖放是现代软件所不能缺少的一个重要功能,其提供了一种在应用程序内部。甚至是在应用程序之间进行信息交互的机制。拖放是由两部分组成的,拖动和释放。拖动是将被拖放的对象进行移动—-是一个按压鼠标并移动的过程,释放是将拖放对象放下–松开鼠标的的过程。下面例子中创建一个例子程序将文本文档,拖入释放后显示文本文件里面的内容

1.新建Qt工程,并在对应ui文件中加入一个TextEdit控件。

MainWindow.h



在MainWindow的头文件中重新声明dragEnterEvent和dropEvent两个函数

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
protected:
    void dragEnterEvent(QDragEnterEvent *event);
    void dropEvent(QDropEvent *event);
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp



在此文件中对上述两个函数进行实现。在mainWindow的构造函数中设置textEdit的acceptdrops为false 设置mainWindow的acceptdrops为true的目的是在文件拖入窗体后释放的时候,textEdit不接收释放事件,而是将释放事件交由mainwindow我们自己实现的函数进行处理。如果textEdit 的acceptdrops为true,mainwindow的acceptdrops设置为false.在程序运行的时候会出现,把文件拖入窗体,在窗体中仅仅显示的是文件的路径和名字,而文本内容并不显示,跟踪发现这时候,我们自己重新实现的dropevent函数没有进行调用。故要保证mainwidow获取拖动的释放事件。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDragEnterEvent>
#include <QUrl>
#include <QFile>
#include <QTextStream>
#include <QMimeData>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{

    ui->setupUi(this);
    ui->textEdit->setAcceptDrops(false);
    setAcceptDrops(true);
    //这两个setAcceptDrops的作用是关闭textEdit的获取释放释放事件,而是让MainWidow去截获此事件

}

MainWindow::~MainWindow()
{
    delete ui;
}

void  MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
    if(event->mimeData()->hasUrls())//数据是否包含URls
    {
        event->acceptProposedAction();//接收动作
        //若不添加此函数,则外部文件无法添加到窗体中
    }
    else
        event->ignore();//忽略事件

}
void MainWindow::dropEvent(QDropEvent *event)
{
    qDebug()<<"dropEvent";
    const QMimeData *mimeData = event->mimeData();//获取mimie数据
        if(mimeData->hasUrls())
        {
            QList<QUrl> urlList = mimeData->urls();//获取url列表
            QString fileName = urlList.at(0).toLocalFile();//将第一个URL作为本地文件路径
            qDebug()<<"fileName:"<<fileName;
            if(!fileName.isEmpty())
            {
                QFile file(fileName);//建立QFile对象,并且以只读方式打开该文件
                if(!file.open(QIODevice::ReadOnly))
                {
                    qDebug()<<"hello";
                    return;
                }
                QTextStream in(&file);
                ui->textEdit->setText(in.readAll());
            }
        }
}



上述代码中的drapenterevent函数是在将文件拖入框体就会自动调用的。在调用的acceptProposedAction函数后,文档才能被拖到窗体中还,否则不能拖入。在调用了此函数后,在拖入后,释放鼠标后会自动调用dropEvent函数。在dropEvent函数中使用mimeData去获取数据。然后从mimeData中去获取拖入的文件列表(有可能拖入的不是一个文件),然后将第一个url所指定的文件以可读方式打开,并将其中内容全部读取并设置到之前在ui文件中放置的textEdit控件中进行显示。



版权声明:本文为no_pao_spite原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。