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(需要插件支持)

相关推荐
莫逸风3 分钟前
【java-core-collections】红黑树深度解析
java·开发语言
Ulyanov16 分钟前
《玩转QT Designer Studio:从设计到实战》 QT Designer Studio入门实战:智能登录系统开发
开发语言·python·qt·雷达电子对抗
人道领域17 分钟前
深度揭秘:JDK 21 虚拟线程原理与性能调优实战
java·开发语言·python·jdk
2501_9481142419 分钟前
大模型API调用成本优化的工程路径:星链4SAPI聚合网关的技术实践
大数据·开发语言·人工智能·架构·php
Foreer黑爷25 分钟前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
南宫萧幕25 分钟前
从YALMIP工具箱到车辆工况仿真:MATLAB控制策略开发的完整实践指南
开发语言·人工智能·matlab·simulink
泰迪智能科技0127 分钟前
图书教材推荐|Python网络爬虫技术(第2版)(微课版)
开发语言·爬虫·python
组合缺一30 分钟前
SolonCode CLI 为什么选择 Java 技术栈?
java·开发语言
czxyvX32 分钟前
2-Qt信号与槽
c++·qt
熊猫钓鱼>_>41 分钟前
GenUI:从“文本对话”到“可操作界面”的范式转移
开发语言·人工智能·agent·sdk·vibecoding·assistant·genui