193 lines
6.0 KiB
C++
Raw Normal View History

#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;
}