利用QT實現圖片瀏覽器的示例詳解
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)); } } }
3、演示圖片
到此這篇關於利用QT實現圖片瀏覽器的示例詳解的文章就介紹到這瞭,更多相關QT圖片瀏覽器內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- QT實現多文件拖拽獲取路徑的方法
- PyQt5使用mimeData實現拖拽事件教程示例解析下
- PyQt5使用mimeData實現拖拽事件教程示例解析上
- C++之Qt5雙緩沖機制案例教程
- Qt實現繪制網格背景的示例代碼