Qt学习笔记——文件拖放操作

实现一个将文本文件拖放到textEdit中显示出来的功能

需要重写两个函数:

void dragEnterEvent(QDragEnterEvent * event);

将文件拖动到组件时,系统会回调该函数

void dropEvent(QDropEvent *event);

当松开鼠标后,系统回调该函数

代码

Widget类:

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

protected:
    void dragEnterEvent(QDragEnterEvent *event);
    void dropEvent(QDropEvent *event);

private:
    bool readFile(const QString &filename);

    Ui::Widget *ui;
};

Widget构造函数:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->textEdit->setAcceptDrops(false);
    //关闭textEdit的拖放事件
    //textEdit默认开启拖放事件
    //如果拖入一个文件,那么默认是将文件名(路径)插入到光标位置

    setAcceptDrops(true);
    //开启widget的拖放事件截取

    setWindowTitle("窗口拖放事件");
}

dragEnterEvent(QDragEnterEvent * event):

void Widget::dragEnterEvent(QDragEnterEvent *event)
{
    //将文件拖动到组件时,系统会回调该函数
    if(event->mimeData()->hasFormat("text/uri-list")){
    //此处是过滤文件类型,只有MIME类型为text/uri-list的才可接收

        event->acceptProposedAction();
        //该函数可以使组件接受文件拖放
    }

    //关于QMimeData
    //MIME 类型为 text/uri-list 通常用来描述一个 URI 列表。
    //这些 URI 可以是文件名,可以是 URL 或者其它的资源描述符。
    //如果发现用户拖放的是一个 text/uri-list 数据(即文件名)
    //那就接受该文件的拖放操作
}

dropEvent(QDropEvent *event):

void Widget::dropEvent(QDropEvent *event)
{
    //当松开鼠标时,系统回调该函数
    QList<QUrl > urls = event->mimeData()->urls();
    if(urls.isEmpty()){
        return ;
    }

    QString filename = urls.first().toLocalFile();
    if(filename.isEmpty()){
        return ;
    }
    if(readFile(filename)){
        setWindowTitle(tr("%1 - %2").arg(filename, tr("Drag File")));
    }

}

readFile(const QString &filename):

bool Widget::readFile(const QString &filename)
{
    QFile file(filename);
    QString strFile;
    if(file.open(QIODevice::ReadOnly)){

        strFile = QString::fromLocal8Bit(file.readAll());
        //避免中文乱码,转换编码
    

        ui->textEdit->setHtml(strFile);
        //将strFile的内容以Html语句写入
        //ui.textEdit->setText(strFile);

        return true;
    }
    return false;
}

代码效果:

 


此处用到的QMimeData

    通过使用Mime类型来判断,拖入组件的对象的类型
   
Mime 类型text/uri-list 通常用来描述一个 URI 列表
    这些
URI 可以是文件名,可以是 URL 或者其它的资源描述符。
    如果发现用户拖放的是一个 text/uri-list 数据(即文件名)
    那就接受该文件的拖放操作

一般拖入文本文件使用 text/uri-list ( 该类型不单指文本文件

猜你喜欢

转载自blog.csdn.net/qq_15710245/article/details/83031444