天宫鹤

Qt应用程序使用拖放打开文件

1.在mainwindow.h文件中添加函数声明:

protected:

void dragEnterEvent(QDragEnterEvent *event) override; // 拖动进入事件

void dropEvent(QDropEvent *event) override; // 放下事件

 

2.在mainwindow.cpp文件中对两个事件处理函数进行定义:

void MainWindow::dragEnterEvent(QDragEnterEvent *event) // 拖动进入事件
{
/*if(event->mimeData()->hasUrls()) // 数据中是否包含URL
        event->acceptProposedAction();                  // 如果是则接收动作
    else event->ignore();                               // 否则忽略该事件
*/
    QStringList acceptedFileTypes(QStringList() << "jpg"
                                                << "png"
                                                << "bmp"
                                                << "txt");

    if (event->mimeData()->hasUrls() && event->mimeData()->urls().count() == 1) {
        QString fileName = event->mimeData()->urls().at(0).toLocalFile();
        QFileInfo file(fileName);
        if (acceptedFileTypes.contains(file.suffix().toLower())) {
            event->acceptProposedAction();
        }
    }
}

void MainWindow::dropEvent(QDropEvent *event)           // 放下事件
{
    QString fileName = event->mimeData()->urls().at(0).toLocalFile();
    QFileInfo file(fileName);
    if (file.suffix().toLower() == "txt")
    {   // 实现文本文件拖放功能
        const QMimeData *mimeData = event->mimeData();      // 获取MIME数据
        if(mimeData->hasUrls()){                            // 如果数据中包含URL
            QList<QUrl> urlList = mimeData->urls();         // 获取URL列表
            // 将其中第一个URL表示为本地文件路径
            QString fileName = urlList.at(0).toLocalFile();
            if(!fileName.isEmpty()){                        // 如果文件路径不为空
                QFile file(fileName);     // 建立QFile对象并且以只读方式打开该文件
                if(!file.open(QIODevice::ReadOnly)) return;
                QTextStream in(&file);                      // 建立文本流对象
                ui->textEdit->setText(in.readAll());  // 将文件中所有内容读入编辑器
            }
        }
    }//if
    else {// 实现图片文件拖放功能
        QPixmap pixmap;
        if(pixmap.load(fileName))
        {
            //! GraphicsView 图形视图显示图像
            QGraphicsScene *scene = new QGraphicsScene(this);//创建场景
            scene->addPixmap(pixmap);                        //在场景中添加图元
            ui->graphicsView->setScene(scene);               //设置图形视图的场景
        }
        else
        {
            QMessageBox::critical(this,
                                  tr("Error"),
                                  tr("The image file cannot be read!"));
        }
    }//else
}

3.进入mainwindow.cpp文件,在构造函数中添加一行代码:
setAcceptDrops(true);// 这样主窗口就可以接收放下事件了

posted on 2022-11-21 20:36  GoGrid  阅读(171)  评论(0编辑  收藏  举报

导航