Qt实现拖放操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014746838/article/details/86608183

拖放包括两个基本动作:拖动、放下。

因此一般需要实现两个事件:

示例问题:通过拖放文件实现Qt应用直接读取文本文件

解决:重写两个基本事件实现拖放识别文件并实现文件读取和显示。

    另外,为识别文件类型,在剪贴板和拖放系统中常使用MIME类型,Qt中的实现为QMimeData类。 可以通过官方示例MIMETypeBrowser检索所有的MIME类型。

示例代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    textEdit=new QTextEdit;
    setCentralWidget(textEdit);
    setWindowTitle(tr("Drag and drop test"));
 
    textEdit->setAcceptDrops(false);
    this->setAcceptDrops(true);
 
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
    if(event->mimeData()->hasFormat("text/uri-list"))
        event->acceptProposedAction();
}
 
void MainWindow::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(QString(fileName+"-DragFile"));
}
 
bool MainWindow::readFile(const QString &fileName)
{
    QFile fileToRead(fileName);
    if(!fileToRead.open(QFile::ReadOnly|QFile::Text))
    {
        textEdit->setText(tr("couldn't open the file for reading"));
        return false;
    }
    QTextStream in(&fileToRead);
    textEdit->append(in.readAll());
    in.flush();
    fileToRead.close();
    return true;
}

运行效果如下:

猜你喜欢

转载自blog.csdn.net/u014746838/article/details/86608183