Qt图片浏览器

参考

Qt图片浏览器

Qt中自适应的label+pixmap充满窗口后,无法缩小只能放大

可以显示jpg、jpeg、png、bmp。可以从电脑上拖动图到窗口并显示出来或者打开文件选择

重载实现dragEnterEvent(拖拽)、dropEvent(拖拽放下)、resizeEvent(窗口大小改变)

结构

在这里插入图片描述

ImageEye.pro

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    imageeye.cpp

HEADERS += \
    imageeye.h

FORMS += \
    imageeye.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${
    
    TARGET}/bin
else: unix:!android: target.path = /opt/$${
    
    TARGET}/bin
!isEmpty(target.path): INSTALLS += target

RESOURCES += \
    res.qrc

main.cpp

#include "imageeye.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    
    
    QApplication a(argc, argv);
    ImageEye w;
    w.show();
    return a.exec();
}

imageeye.h

#ifndef IMAGEEYE_H
#define IMAGEEYE_H

#include <QMainWindow>
#include <QWidget>
#include <QSize>
#include <iostream>
#include <QPixmap>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>
#include <QFileInfo>
#include <QMessageBox>
#include <QResizeEvent>
#include <QStringList>
#include <QLabel>
#include <QFileDialog>
#include <QDebug>

using namespace std;

QT_BEGIN_NAMESPACE
namespace Ui {
    
     class ImageEye; }
QT_END_NAMESPACE

class ImageEye : public QMainWindow
{
    
    
    Q_OBJECT

private:
    QPixmap pixmap;

public:
    ImageEye(QWidget *parent = nullptr);
    ~ImageEye();


    void dragEnterEvent(QDragEnterEvent *event)override;//拖进事件
    void dropEvent(QDropEvent *event)override;// 拖进放下事件
    void resizeEvent(QResizeEvent *event)override;//用于在窗口大小改变时处理事件
public slots:
    void    OnSetMediaFile(void);//载入
    void    OnClean(void);//载入

private:
    Ui::ImageEye *ui;
};
#endif // IMAGEEYE_H

imageeye.cpp

#include "imageeye.h"
#include "ui_imageeye.h"

ImageEye::ImageEye(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::ImageEye)
{
    
    
    ui->setupUi(this);
    this->setWindowTitle("图片浏览器");
    this->setWindowIcon(QIcon(":/ImageEye.jpg"));
    this->setAcceptDrops(true);//设置允许向窗口拖入图片
    this->setMinimumSize(QSize(400,300));// 设置最小值

    ui->label->setAlignment(Qt::AlignCenter);  //居中显示

    //自适应的label+pixmap充满窗口后,无法缩小只能放大
    ui->label->setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);// Ignored忽略

    // 设置拉伸因子(默认缩到最小时失效:一样大小)
    ui->verticalLayout->setStretch(10,1);

    //设置窗口布局,(此时控件会随窗口缩放)
    ui->centralwidget->setLayout(ui->verticalLayout);

    // 2.界面美化
    QPalette qplte;// 调色板
    qplte.setColor(QPalette::Window, QColor(0,0,0));// 透明
    this->setPalette(qplte);// 设置窗口部件的调色板

    ui->BtnClean->raise();//显示在最上层
    ui->BtnLoad->raise();//显示在最上层
    ui->label->lower();//显示在最下层

    connect(ui->BtnLoad, SIGNAL(clicked()), this, SLOT(OnSetMediaFile()));//载入
    connect(ui->BtnClean, SIGNAL(clicked()), this, SLOT(OnClean()));

}

ImageEye::~ImageEye()
{
    
    
    delete ui;
}

//拖进事件
void ImageEye::dragEnterEvent(QDragEnterEvent *event)
{
    
    
    // 如果文件的后缀名是jpg、jpeg、bmp或png,则接受拖放事件,否则忽略拖放事件
    QStringList acceptedFileTypes;
    acceptedFileTypes.append("jpg");
    acceptedFileTypes.append("jpeg");
    acceptedFileTypes.append("bmp");
    acceptedFileTypes.append("png");
    // 用于检查拖放的数据是否包含URL,并且获取拖放事件中的URL数量==1
    if(event->mimeData()->hasUrls()&&event->mimeData()->urls().count()==1)
    {
    
    
        // 获取拖放事件中的第一个URL的本地文件路径
        QFileInfo file(event->mimeData()->urls().at(0).toLocalFile());
        // 检查文件的后缀名是否在接受的文件类型列表中;(获取文件的后缀名,并将其转换为小写字母)
        if(acceptedFileTypes.contains(file.suffix().toLower()))
        {
    
    
            event->acceptProposedAction();//表明用户可以在窗口部件上拖放对象[接受拖放事件的操作]
        }
    }
}
// 拖进放下事件
void ImageEye::dropEvent(QDropEvent *event)
{
    
    
    // 获取拖放事件中的第一个URL的本地文件路径
    QFileInfo file(event->mimeData()->urls().at(0).toLocalFile());

    qDebug()<<"绝对路径:"<<file.absoluteFilePath();
    //从文件中加载图片,参数file.absoluteFilePath()表示文件的绝对路径,load()返回一个bool值,表示是否加载成功
    if(pixmap.load(file.absoluteFilePath()))
    {
    
    
        // 将图片缩放到指定大小,参数ui->label->size()表示缩放的大小,Qt::KeepAspectRatio表示保持图片的宽高比,Qt::SmoothTransformation表示使用平滑缩放算法
        ui->label->setPixmap(pixmap.scaled(ui->label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
        this->setWindowTitle(file.absoluteFilePath());
    }else
    {
    
    
        // 错误消息框
        QMessageBox::critical(this,tr("Error"),tr("The image file count not be read"));
    }
}
// 用于在窗口大小改变时处理事件
int i=0;
void ImageEye::resizeEvent(QResizeEvent *event)
{
    
    
    Q_UNUSED(event);//忽略编译器发出的警告,表明变量event未使用
    qDebug()<<"窗口大小改变:"<<i++;
    if(!pixmap.isNull())
    {
    
    
        ui->label->setPixmap(pixmap.scaled(ui->label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
    }

}
//载入
void ImageEye::OnSetMediaFile()
{
    
    
    QFileDialog dialog(this);//文件选择窗口
    dialog.setNameFilter(tr("Images (*.jpg *.jpeg *.bmp *.png)"));// 过滤器
    dialog.setFileMode(QFileDialog::AnyFile);//设置文件模式(文件/文件夹):任意文件,无论是否存在
    QStringList fileNames;
    if (dialog.exec())
        fileNames = dialog.selectedFiles();// 存所有选择的文件

    if(!fileNames.isEmpty())
    {
    
    
        if(pixmap.load(fileNames[0]))
        {
    
    
            qDebug()<<"文件名:"<<fileNames[0];
            ui->label->setPixmap(pixmap.scaled(ui->label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
            this->setWindowTitle(fileNames[0]);
        }
    }
}

void ImageEye::OnClean()
{
    
    
    ui->label->clear();
    this->setWindowTitle("图片浏览器");
}

imageeye.ui

在这里插入图片描述

效果

  • 启动
    在这里插入图片描述

  • 运行
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_47355554/article/details/129181887