QT 实现图片查看工具
1、选择图像文件
- 单文件选择 QFileDialog::getOpenFileName
- 多文件选择 QFileDialog::getOpenFileNames
QList<QString> imageNames = QFileDialog::getOpenFileNames(this,tr("打开图片"),"",tr("图片文件 (*.png *.jpg *.bmp *.jpeg)"));
2、选择文件夹, 列出图像
- QFileDialog::getExistingDirectory
QString folderName = QFileDialog::getExistingDirectory(this,"打开文件夹","");
// 创建 QDir 对象
QDir dir(folderName);
// 设置过滤器 - 只获取文件,忽略子目录
//dir.setFilter(QDir::Files);
// 获取该目录下的所有文件
QFileInfoList fileList = dir.entryInfoList();
// 遍历并输出文件名
foreach (QFileInfo fileInfo, fileList) {
QString fileName = fileInfo.fileName();
if(fileName.endsWith(".png")
||fileName.endsWith(".jpg")
||fileName.endsWith(".bmp")
||fileName.endsWith(".jpeg"))
{
images.append(fileName);
}
}
3、图片显示
1、Label显示图片
QPixmap pixmap(images[ImageIndex]);
pixmap = pixmap.scaled(imgCtrl->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
imgCtrl->setPixmap(pixmap);
imgCtrl->setAlignment(Qt::AlignCenter);
2、QPainter 显示图片
// 创建一个QPainter,用于绘制图片
QPainter painter(this);
painter.setRenderHint(QPainter::SmoothPixmapTransform); // 开启平滑缩放
// 计算缩放后的图片尺寸
QSize scaledSize = pixmap.size() * scaleFactor;
// 绘制图片,应用缩放和偏移量
painter.drawPixmap(offset, pixmap.scaled(scaledSize, Qt::KeepAspectRatio, Qt::SmoothTransformation));
4、事件
1. 处理鼠标事件
要处理鼠标事件,可以重载以下鼠标相关的事件处理函数:
mousePressEvent(QMouseEvent *event): 处理鼠标按下事件。
mouseReleaseEvent(QMouseEvent *event): 处理鼠标释放事件。
mouseMoveEvent(QMouseEvent *event): 处理鼠标移动事件。
mouseDoubleClickEvent(QMouseEvent *event): 处理鼠标双击事件。
2. 处理键盘事件
要处理键盘事件,可以重载以下键盘相关的事件处理函数:
keyPressEvent(QKeyEvent *event): 处理键盘按下事件。
keyReleaseEvent(QKeyEvent *event): 处理键盘释放事件。
3、实现Label图片移动
void Widget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
isDragging = true; // 标记为正在拖动
lastMousePosition = event->pos(); // 记录鼠标按下时的位置
}
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
if (isDragging) {
// 计算鼠标移动的距离 (偏移量)
QPoint pos = event->pos();
QPoint delta = pos - lastMousePosition;
// 更新图片的位置 (移动图片)
imgCtrl->move(imgCtrl->pos() + delta);
// 更新鼠标位置,以便下一次移动时计算新的偏移量
lastMousePosition = event->pos();
}
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
isDragging = false; // 结束拖动
}
}
4、QPainter实现图片移动和缩放
- ImageWidget 需要拆分出去,拆分成ImageWidget,h 和 ImageWidget.cpp
#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QPixmap>