利用QT实现图片浏览器的示例详解

 更新时间:2023年02月23日 15:32:41   作者:音视频开发老舅  
这篇文章主要和大家分享一个小案例:利用QT制作一个小的图片浏览器,要求可以显示jpg、jpeg、png、bmp,还可以从电脑上拖动图到窗口并显示出来,感兴趣的可以了解一下

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图片浏览器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c语言实现把文件中数据读取并存到数组中

    c语言实现把文件中数据读取并存到数组中

    下面小编就为大家带来一篇c语言实现把文件中数据读取并存到数组中。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C++三色球问题描述与算法分析

    C++三色球问题描述与算法分析

    这篇文章主要介绍了C++三色球问题描述与算法分析,结合注释形式详细讲述了三色球问题的描述与相应的算法设计思路,并给出了相关的实现方法,需要的朋友可以参考下
    2016-05-05
  • vs2019安装及简单处理技巧(超详细)

    vs2019安装及简单处理技巧(超详细)

    这篇文章主要介绍了vs2019安装及简单处理方法,本文是一篇非常详细的教程,通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • C语言中宏定义的妙用方法

    C语言中宏定义的妙用方法

    今天小编就为大家分享一篇关于C语言中宏定义的妙用方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C语言时间处理实例分享

    C语言时间处理实例分享

    这篇文章主要介绍了C语言时间处理实例分享的相关资料,需要的朋友可以参考下
    2015-07-07
  • C语言版三子棋游戏实现代码

    C语言版三子棋游戏实现代码

    这篇文章主要为大家详细介绍了C语言版三子棋游戏的实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • c++特殊构造函数详解

    c++特殊构造函数详解

    大家好,本篇文章主要讲的是c++特殊构造函数详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • C++的继承和派生你了解吗

    C++的继承和派生你了解吗

    这篇文章主要为大家详细介绍了C++继承和派生,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C++ 计数排序实例详解

    C++ 计数排序实例详解

    这篇文章主要介绍了C++ 计数排序实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • 解析VC中创建DLL,导出全局变量,函数和类的深入分析

    解析VC中创建DLL,导出全局变量,函数和类的深入分析

    本篇文章是对VC中创建DLL,导出全局变量,函数和类进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论