QT C++ 实现图像查看器

主要功能:
  • 点击"查看图像"按钮弹出文件夹选择对话框

  • 自动识别常见的图片格式(jpg、png、bmp、gif、tiff等)

  • 显示文件夹中的第一张图片

  • 支持上一张/下一张切换

  • 在label框中显示当前图片的完整路径和序号信息

  • 当到达第一张或最后一张时,自动禁用对应的按钮

  • 显示控件 :使用QLabel作为图片显示控件,可以自动缩放图片以适应显示区域

1. 头文件 (ImageViewer.h)

cpp 复制代码
#ifndef IMAGEVIEWER_H
#define IMAGEVIEWER_H

#include <QMainWindow>
#include <QStringList>
#include <QLabel>
#include <QPixmap>

QT_BEGIN_NAMESPACE
namespace Ui { class ImageViewer; }
QT_END_NAMESPACE

class ImageViewer : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_lookImageBtn_clicked();      // 查看图像按钮槽函数
    void on_lastBtn_clicked();           // 上一张按钮槽函数
    void on_nextBtn_clicked();           // 下一张按钮槽函数

private:
    Ui::ImageViewer *ui;
    
    QStringList m_imagePaths;            // 存储所有图片路径
    int m_currentIndex;                  // 当前显示图片的索引
    
    void loadImage(const QString &path); // 加载并显示图片
    void updateButtons();                // 更新按钮状态
    bool isImageFile(const QString &filePath); // 判断是否为图片文件
};

#endif // IMAGEVIEWER_H

2. 源文件 (ImageViewer.cpp)

cpp 复制代码
#include "ImageViewer.h"
#include "ui_ImageViewer.h"
#include <QFileDialog>
#include <QDir>
#include <QMessageBox>
#include <QDebug>

ImageViewer::ImageViewer(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::ImageViewer)
    , m_currentIndex(-1)
{
    ui->setupUi(this);
    
    // 设置窗口标题
    this->setWindowTitle("图像查看器");
    
    // 初始化按钮状态
    updateButtons();
}

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

void ImageViewer::on_lookImageBtn_clicked()
{
    // 弹出文件夹选择对话框
    QString folderPath = QFileDialog::getExistingDirectory(
        this,
        "选择图片文件夹",
        QDir::homePath(),
        QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks
    );
    
    if (folderPath.isEmpty()) {
        return; // 用户取消了选择
    }
    
    // 清空之前的图片列表
    m_imagePaths.clear();
    m_currentIndex = -1;
    
    // 获取文件夹中所有图片文件
    QDir folder(folderPath);
    QStringList filters;
    filters << "*.jpg" << "*.jpeg" << "*.png" << "*.bmp" << "*.gif" << "*.tiff" << "*.tif";
    folder.setNameFilters(filters);
    folder.setFilter(QDir::Files | QDir::NoDotAndDotDot);
    
    // 获取所有符合条件的文件
    QFileInfoList fileList = folder.entryInfoList();
    
    if (fileList.isEmpty()) {
        QMessageBox::information(this, "提示", "所选文件夹中没有图片文件!");
        ui->label_ImagePath->clear();
        return;
    }
    
    // 将文件路径添加到列表中
    for (const QFileInfo &fileInfo : fileList) {
        if (isImageFile(fileInfo.filePath())) {
            m_imagePaths.append(fileInfo.absoluteFilePath());
        }
    }
    
    if (m_imagePaths.isEmpty()) {
        QMessageBox::information(this, "提示", "所选文件夹中没有图片文件!");
        ui->label_ImagePath->clear();
        return;
    }
    
    // 显示第一张图片
    m_currentIndex = 0;
    loadImage(m_imagePaths[m_currentIndex]);
    
    // 更新按钮状态
    updateButtons();
}

void ImageViewer::on_lastBtn_clicked()
{
    if (m_currentIndex > 0) {
        m_currentIndex--;
        loadImage(m_imagePaths[m_currentIndex]);
        updateButtons();
    }
}

void ImageViewer::on_nextBtn_clicked()
{
    if (m_currentIndex < m_imagePaths.size() - 1) {
        m_currentIndex++;
        loadImage(m_imagePaths[m_currentIndex]);
        updateButtons();
    }
}

void ImageViewer::loadImage(const QString &path)
{
    QPixmap pixmap(path);
    
    if (pixmap.isNull()) {
        QMessageBox::warning(this, "错误", QString("无法加载图片:%1").arg(path));
        return;
    }
    
    // 获取label控件的大小,用于自适应显示图片
    QSize labelSize = ui->imageLabel->size();
    
    // 如果label大小无效,设置一个默认大小
    if (labelSize.width() <= 0 || labelSize.height() <= 0) {
        labelSize = QSize(800, 600);
    }
    
    // 缩放图片以适应label,保持宽高比
    QPixmap scaledPixmap = pixmap.scaled(
        labelSize,
        Qt::KeepAspectRatio,
        Qt::SmoothTransformation
    );
    
    // 显示图片
    ui->imageLabel->setPixmap(scaledPixmap);
    ui->imageLabel->setAlignment(Qt::AlignCenter);
    
    // 在label中显示当前文件路径和图片信息
    QString fileInfo = QString("%1\n尺寸:%2 x %3\n索引:%4/%5")
        .arg(path)
        .arg(pixmap.width())
        .arg(pixmap.height())
        .arg(m_currentIndex + 1)
        .arg(m_imagePaths.size());
    
    ui->label_ImagePath->setText(fileInfo);
    ui->label_ImagePath->setWordWrap(true); // 允许自动换行
}

void ImageViewer::updateButtons()
{
    // 更新上一张按钮状态
    ui->lastBtn->setEnabled(m_currentIndex > 0);
    
    // 更新下一张按钮状态
    ui->nextBtn->setEnabled(m_currentIndex >= 0 && 
                            m_currentIndex < m_imagePaths.size() - 1);
    
    // 如果没有图片,禁用两个按钮
    if (m_imagePaths.isEmpty()) {
        ui->lastBtn->setEnabled(false);
        ui->nextBtn->setEnabled(false);
    }
}

bool ImageViewer::isImageFile(const QString &filePath)
{
    // 通过文件扩展名判断是否为图片文件
    QString suffix = QFileInfo(filePath).suffix().toLower();
    return suffix == "jpg" || suffix == "jpeg" || 
           suffix == "png" || suffix == "bmp" || 
           suffix == "gif" || suffix == "tiff" || 
           suffix == "tif";
}

知识点总结:

QFileDialog - 文件对话框
cpp 复制代码
// 选择文件夹
QString folderPath = QFileDialog::getExistingDirectory(
    this,
    "选择图片文件夹",           // 对话框标题
    QDir::homePath(),           // 默认打开路径
    QFileDialog::ShowDirsOnly   // 只显示文件夹
);
QDir - 目录操作
cpp 复制代码
QDir folder(folderPath);

// 设置过滤器
folder.setFilter(QDir::Files | QDir::NoDotAndDotDot | QDir::Readable);

// 获取文件信息列表
QFileInfoList fileList = folder.entryInfoList();

// 遍历文件
for (const QFileInfo &fileInfo : fileList) {
    QString suffix = fileInfo.suffix().toLower();
    // 处理文件...
}
QFileInfo - 文件信息
cpp 复制代码
QFileInfo fileInfo(path);

fileInfo.exists();           // 文件是否存在
fileInfo.fileName();         // 文件名
fileInfo.absoluteFilePath(); // 绝对路径
fileInfo.suffix();           // 扩展名
fileInfo.size();             // 文件大小
QPixmap - 图像处理类
cpp 复制代码
// 加载图片
QPixmap pixmap(path);

// 检查是否加载成功
if (pixmap.isNull()) {
    // 图片加载失败
}

// 缩放图片(保持宽高比)
QPixmap scaledPixmap = pixmap.scaled(
    labelSize,                  // 目标尺寸
    Qt::KeepAspectRatio,        // 保持宽高比
    Qt::SmoothTransformation    // 平滑缩放
);

// 获取图片信息
int width = pixmap.width();
int height = pixmap.height();
QSize size = pixmap.size();

图片缩放模式对比

模式 说明 适用场景
Qt::KeepAspectRatio 保持宽高比,可能留有空白 图片预览,不改变原图比例
Qt::KeepAspectRatioByExpanding 保持宽高比,裁剪超出部分 全屏显示,无空白
Qt::IgnoreAspectRatio 忽略宽高比,拉伸填充 图标等需要精确尺寸的场景
支持的图片格式

Qt 默认支持以下图片格式:

  • PNG、JPEG、BMP、GIF

  • TIFF、ICO、WebP(需要插件支持)

相关推荐
yaoxin5211232 小时前
368. Java IO API - 基本文件属性
java·开发语言·python
郝学胜-神的一滴2 小时前
Qt6 + OpenGL 3.3 渲染环境搭建全指南:从空白窗口到专属渲染画布的优雅实现
数据结构·c++·线性代数·算法·系统架构·图形渲染
建军啊2 小时前
java审计进阶
java·开发语言·python
2401_889626922 小时前
Java流程控制与方法全解析
java·开发语言
码界筑梦坊2 小时前
329-基于Python的交通流量数据可视化分析系统
开发语言·python·信息可视化·数据分析·django·vue·毕业设计
yong99902 小时前
带挂载的四轴飞行器模型预测控制(MPC) MATLAB实现
开发语言·matlab
报错小能手2 小时前
ios开发方向——对于实习开发的app(Robopocket)讲解
开发语言·学习·ios·swift
wjs20242 小时前
Swift 方法
开发语言
样例过了就是过了2 小时前
LeetCode热题100 最小栈
数据结构·c++·算法·leetcode