目录
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图片阅读器内容请搜索网站以前的文章或继续阅读下面的相关文章希望大家以后多多支持网站! |