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

相关文章

  • Trae+Qt+MSVC环境配置的实现示例

    Trae+Qt+MSVC环境配置的实现示例

    本文主要介绍了Trae+Qt+MSVC环境配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • 用C语言实现贪吃蛇小游戏

    用C语言实现贪吃蛇小游戏

    这篇文章主要为大家详细介绍了用C语言实现贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C++实现LeetCode(47.全排列之二)

    C++实现LeetCode(47.全排列之二)

    这篇文章主要介绍了C++实现LeetCode(47.全排列之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 详解C++基础——类继承中方法重载

    详解C++基础——类继承中方法重载

    这篇文章主要介绍了C++基础——类继承中方法重载,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • C++ 中

    C++ 中"priority_queue" 优先级队列实例详解

    这篇文章主要介绍了C++ 中"priority_queue" 优先级队列实例详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • Qt使用OpenGL实现绘制3D图形

    Qt使用OpenGL实现绘制3D图形

    OpenGL是一个跨平台的、用来渲染3D图形的标准API,Qt对OpenGL提供了强大的支持,所以本文就来和大家介绍一下Qt如何使用OpenGL实现绘制3D图形吧
    2023-10-10
  • C/C++实现快速排序算法的思路及原理解析

    C/C++实现快速排序算法的思路及原理解析

    这篇文章主要介绍了C/C++实现快速排序算法的思路及原理解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • MFC实现字幕滚动效果

    MFC实现字幕滚动效果

    这篇文章主要为大家详细介绍了MFC实现滚动字幕,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C++使用递归函数和栈操作逆序一个栈的算法示例

    C++使用递归函数和栈操作逆序一个栈的算法示例

    这篇文章主要介绍了C++使用递归函数和栈操作逆序一个栈的算法,结合实例形式分析了C++递归函数与逆序栈的相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • c++ 防止头文件重复引入的三种方法

    c++ 防止头文件重复引入的三种方法

    这篇文章主要介绍了c++ 防止头文件重复引入的三种方法,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下
    2021-02-02

最新评论