主要功能:
-
点击"查看图像"按钮弹出文件夹选择对话框
-
自动识别常见的图片格式(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(需要插件支持)