1、概述
案例:制作一個小的圖檔浏覽器,要求可以顯示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:下面是完整代碼
2、代碼示例
#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));
}
}
}
QT開發交流+赀料君羊:714620761