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)); } } }
三、演示图片
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探