193 lines
6.0 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "ImageTileWidget.h"
#include <QPainter>
#include <QMouseEvent>
#include <QFileInfo>
#include <QLabel>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFontMetrics>
#include <QStyleOption>
#include <QImageReader>
ImageTileWidget::ImageTileWidget(QWidget* parent)
: QWidget(parent) {
setMinimumSize(120, 120);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
// 设置零边距,确保控件之间无缝隙
setContentsMargins(0, 0, 0, 0);
// 创建缩小按钮
m_shrinkButton = new QPushButton("×", this);
m_shrinkButton->setFixedSize(24, 24);
m_shrinkButton->setStyleSheet(
"QPushButton {"
" background-color: #ff4444;"
" color: white;"
" border: none;"
" border-radius: 12px;"
" font-weight: bold;"
" font-size: 14px;"
"}"
"QPushButton:hover {"
" background-color: #cc0000;"
"}"
);
m_shrinkButton->hide();
connect(m_shrinkButton, &QPushButton::clicked, this, [this]() {
emit shrinkRequested();
});
}
void ImageTileWidget::setImagePath(const QString& path) {
m_path = path;
m_pix = QPixmap(path);
update();
}
void ImageTileWidget::setImage(const QImage& image) {
m_pix = QPixmap::fromImage(image);
update();
}
void ImageTileWidget::setSelected(bool sel) {
if (m_selected == sel) return;
m_selected = sel;
update();
}
void ImageTileWidget::setExpanded(bool expanded) {
if (m_expanded == expanded) return;
m_expanded = expanded;
m_shrinkButton->setVisible(expanded);
update();
}
QSize ImageTileWidget::sizeHint() const {
if (m_expanded) {
// 展开时使用父控件的大小或默认大小
if (parentWidget()) {
return parentWidget()->size();
}
return QSize(600, 400);
}
// 非展开模式下,返回当前控件大小以支持动态缩放
return size();
}
void ImageTileWidget::paintEvent(QPaintEvent*) {
QPainter p(this);
p.setRenderHint(QPainter::Antialiasing, true);
// 绘制背景
p.fillRect(rect(), QColor(37, 38, 42));
if (m_expanded) {
// 展开模式:全屏显示图片,在左下角显示图片名称
QRect imageRect = rect();
// 绘制图片区域
if (!m_pix.isNull()) {
// 计算保持比例的缩放,确保整个图片可见
QPixmap scaled = m_pix.scaled(imageRect.size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
// 计算居中位置
int x = imageRect.center().x() - scaled.width() / 2;
int y = imageRect.center().y() - scaled.height() / 2;
// 绘制图片(完整显示,不超出区域)
p.drawPixmap(x, y, scaled);
} else {
p.setPen(Qt::white);
p.drawText(imageRect, Qt::AlignCenter, "No Image");
}
} else {
// 正常模式:根据对齐方式显示图片,保持比例不变形,完整显示不裁剪
QRect inner = rect();
if (!m_pix.isNull()) {
// 使用KeepAspectRatio保持比例确保整个图片可见不裁剪不拉伸
QPixmap scaled = m_pix.scaled(inner.size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
// 水平居中
int x = inner.center().x() - scaled.width() / 2;
int y = inner.center().y() - scaled.height() / 2;
// 根据对齐方式调整垂直位置
if (m_imageAlignment & Qt::AlignTop) {
y = inner.top();
} else if (m_imageAlignment & Qt::AlignBottom) {
y = inner.bottom() - scaled.height();
}
// 水平对齐调整
if (m_imageAlignment & Qt::AlignLeft) {
x = inner.left();
} else if (m_imageAlignment & Qt::AlignRight) {
x = inner.right() - scaled.width();
}
p.drawPixmap(x, y, scaled);
} else {
p.setPen(Qt::white);
p.drawText(inner, Qt::AlignCenter, "No Image");
}
// 在左下角显示图片名称
if (!m_path.isEmpty()) {
QFileInfo fileInfo(m_path);
QString fileName = fileInfo.fileName();
p.setPen(Qt::black);
QFont font = p.font();
font.setPointSize(8);
p.setFont(font);
QFontMetrics metrics(font);
int textWidth = metrics.horizontalAdvance(fileName) + 10;
int textHeight = metrics.height() + 4;
QRect textRect(5, height() - textHeight - 5, textWidth, textHeight);
p.drawText(textRect, Qt::AlignCenter, fileName);
}
}
// 不绘制边框,避免产生视觉间隙
}
void ImageTileWidget::mousePressEvent(QMouseEvent* ev) {
if (ev->button() == Qt::LeftButton) emit clicked();
QWidget::mousePressEvent(ev);
}
void ImageTileWidget::resizeEvent(QResizeEvent* event) {
QWidget::resizeEvent(event);
updateShrinkButtonPosition();
}
void ImageTileWidget::updateShrinkButtonPosition() {
if (m_shrinkButton) {
m_shrinkButton->move(width() - m_shrinkButton->width() - 5, 5);
}
}
QString ImageTileWidget::getImageInfo() const {
if (m_path.isEmpty()) return "No image loaded";
QFileInfo fileInfo(m_path);
QString info;
info += QString("文件名: %1\n").arg(fileInfo.fileName());
info += QString("大小: %1 KB\n").arg(fileInfo.size() / 1024);
info += QString("修改时间: %1\n").arg(fileInfo.lastModified().toString("yyyy-MM-dd hh:mm:ss"));
if (!m_pix.isNull()) {
info += QString("尺寸: %1 x %2\n").arg(m_pix.width()).arg(m_pix.height());
info += QString("格式: %1\n").arg(QImageReader::imageFormat(m_path).constData());
}
return info;
}