拖放(二)

  • 当鼠标拖拽一个数据进入主窗口时,就会触发dragEnterEvent()事件处理函数
  • 获取其中MIME数据
  • 查看他是否包含URL路径(拖入文本文件实际就是拖入他的路径)
  • 即,event -> mimeData() -> hasUrls()实现
  • 有数据接收,否则忽略该事件
  • 当松开鼠标左键,将数据放入主窗口时就会触发dropEvent()事件来处理函数
  • 获取MIME数据中的URL列表,因为拖入的只有一个文件,所以获取列表中的第一个条目
  • 调用toLocakFile()函数将他转换为本地文件路径
  • 最后用QFile和QTextStream将文件中的数据读入编辑器中

代码:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFile>
#include <QTextStream>
#include <QMimeData>
#include <QDragEnterEvent>
#include <QUrl>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
protected:
    // 拖动文件进入会触发的事件
    void dragEnterEvent(QDragEnterEvent *event);
    // 文件放下会触发的事件
    void dropEvent(QDropEvent *event);
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

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

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

void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
    if(event->mimeData()->hasUrls())
        event->acceptProposedAction();
    else
        event->ignore();
}

void MainWindow::dropEvent(QDropEvent *event)
{
    const QMimeData *mimeData = event->mimeData();
    if(mimeData->hasUrls())
    {
        QList<QUrl> urlList = mimeData->urls();
        QString fileName = urlList.at(0).toLocalFile();
        if(!fileName.isEmpty())
        {
            QFile file(fileName);
            if(!file.open(QIODevice::ReadOnly))
                return;
            QTextStream in(&file);
            ui->textEdit->setText(in.readAll());
        }
    }
}

拖放(二)

拖入桌面的一个.txt文件之后的效果!

关键点:QMimeData数据类型、hasUrls函数

 

参考:

不二如是:https://fishc.com.cn/thread-77174-1-1.html

上一篇:qt_Painter


下一篇:Qt 27 应用程序中的主窗口