Qt拖放圖片到窗口中並顯示


一、概述

  案例:制作一個小的圖片瀏覽器,要求可以顯示jpg、jpeg、png、bmp。可以從電腦上拖動圖到窗口並顯示出來。 

  實現步驟:

    1.創建一個QWidget

    2.在QWidget的構造方法中設置一個QLabel用戶顯示pixmap

    3.在QWidget的protected中定義三個函數,dragEnterEvent(QDragEnterEvent *event)、dropEvent(QDropEvent *event)、resizeEvent(QResizeEvent *event);並在.cpp中實現這三個方法

    4.在QWidget的構造函數中加入setAccessDrop(true),設置可向窗口拖拽內容

    5.實現dragEnterEvent(拖拽)、dropEvent(拖拽放下)、resizeEvent(窗口重置)

    6.實現第5步的三個方法

    7.在drawEnterEvent中過濾可拖拽的文件

void watershedwindow::dragEnterEvent(QDragEnterEvent *event){
    QStringList acceptedFileTypes;
    acceptedFileTypes.append("jpg");
    acceptedFileTypes.append("jpeg");
    acceptedFileTypes.append("bmp");
    acceptedFileTypes.append("png");
    if(event->mimeData()->hasUrls()&&event->mimeData()->urls().count()==1){
        QFileInfo file(event->mimeData()->urls().at(0).toLocalFile());
        if(acceptedFileTypes.contains(file.suffix().toLower())){
            event->acceptProposedAction();//表明用戶可以在窗口部件上拖放對象
        }
    }
}

    8.在dropEvent方法中實現文件拖拽放下后的情況,即顯示圖片

void watershedwindow::dropEvent(QDropEvent *event){
    QFileInfo file(event->mimeData()->urls().at(0).toLocalFile());
    if(pixmap.load(file.absoluteFilePath())){
        label->setPixmap(pixmap.scaled(label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
    }else{
        QMessageBox::critical(this,tr("Error"),tr("The image file count not be read"));
    }
}

    9.resizeEvent方法中對圖像進行重置

void watershedwindow::resizeEvent(QResizeEvent *event){
    Q_UNUSED(event);
    if(!pixmap.isNull()){
        label->setPixmap(pixmap.scaled(label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
    }

}

    10.結束

  ps:下面是完整代碼

二、代碼示例

#include "opencv2/opencv.hpp"
#include <QWidget>
#include <QSize>
#include <iostream>
#include <QPixmap>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>
#include <QFileInfo>
#include <QMessageBox>
#include <QResizeEvent>
#include <QStringList>
#include <QLabel>

using namespace cv;
using namespace std;

class watershedwindow : public QWidget
{
    Q_OBJECT
private:
    Mat src,gray,result,distanceImage;
    QPixmap pixmap;
    QLabel *label;
public:
    explicit watershedwindow(QWidget *parent = nullptr);protected:
    /**
     * 拖進事件
     * @brief dragEnterEvent
     * @param event
     */
    void dragEnterEvent(QDragEnterEvent *event);
    /**
     * 拖進放下事件
     * @brief dropEvent
     * @param event
     */
    void dropEvent(QDropEvent *event) ;
    void resizeEvent(QResizeEvent *event);

signals:

};
#include "watershedwindow.h"

watershedwindow::watershedwindow(QWidget *parent) : QWidget(parent)
{
    this->setAcceptDrops(true);//設置允許向窗口拖入圖片
    this->setFixedSize(QSize(320,480));
    label = new QLabel(this);
    label->setFixedSize(this->width(),this->height());
}


void watershedwindow::dragEnterEvent(QDragEnterEvent *event){
    QStringList acceptedFileTypes;
    acceptedFileTypes.append("jpg");
    acceptedFileTypes.append("jpeg");
    acceptedFileTypes.append("bmp");
    acceptedFileTypes.append("png");
    if(event->mimeData()->hasUrls()&&event->mimeData()->urls().count()==1){
        QFileInfo file(event->mimeData()->urls().at(0).toLocalFile());
        if(acceptedFileTypes.contains(file.suffix().toLower())){
            event->acceptProposedAction();//表明用戶可以在窗口部件上拖放對象
        }
    }
}


void watershedwindow::dropEvent(QDropEvent *event){
    QFileInfo file(event->mimeData()->urls().at(0).toLocalFile());
    if(pixmap.load(file.absoluteFilePath())){
        label->setPixmap(pixmap.scaled(label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
    }else{
        QMessageBox::critical(this,tr("Error"),tr("The image file count not be read"));
    }
}


void watershedwindow::resizeEvent(QResizeEvent *event){
    Q_UNUSED(event);
    if(!pixmap.isNull()){
        label->setPixmap(pixmap.scaled(label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
    }

}
}

三、演示圖片

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM