如何利用QT实现图片浏览器

发布时间:2023-02-23 16:35:00 作者:iii
来源:亿速云 阅读:144

这篇文章主要介绍了如何利用QT实现图片浏览器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何利用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));
    }
 
}

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));
    }
 
}
}

关于“如何利用QT实现图片浏览器”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“如何利用QT实现图片浏览器”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. QT透明的经验汇编
  2. QT Model/View 六个连续冲击

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

qt

上一篇:vue3如何数据监听watch/watchEffect

下一篇:Vue2中的数据劫持怎么实现

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》