Skip to content

ElaImageCard 组件文档

概述

ElaImageCard 是一个现代化的图片卡片组件,提供了圆角、裁剪、纵横比控制等特性。它能够自动处理图片的显示效果,并支持主题切换。

特性

  • 圆角边框
  • 纵横比控制
  • 智能裁剪
  • 平滑渲染
  • 主题适配
  • 最小尺寸限制
  • 抗锯齿
  • 图片缩放

属性

基础属性

cpp
// 卡片图片
Q_PROPERTY(QImage cardImage READ getCardImage 
    WRITE setCardImage)

// 边框圆角
Q_PROPERTY(int borderRadius READ getBorderRadius 
    WRITE setBorderRadius)

// 是否保持纵横比裁剪
Q_PROPERTY(bool isPreserveAspectCrop 
    READ getIsPreserveAspectCrop 
    WRITE setIsPreserveAspectCrop)

// 最大纵横比
Q_PROPERTY(qreal maximumAspectRatio 
    READ getMaximumAspectRatio 
    WRITE setMaximumAspectRatio)

默认值

  • 最小尺寸: 350x260
  • 边框圆角: 6px
  • 最大纵横比: 2.2
  • 保持纵横比: true

使用示例

基础用法

1. 创建图片卡片

cpp
// 创建卡片
ElaImageCard* imageCard = new ElaImageCard(this);

// 设置图片
imageCard->setCardImage(QImage(":/images/background.png"));

// 设置圆角
imageCard->setBorderRadius(10);

// 设置固定大小
imageCard->setFixedSize(400, 300);

2. 纵横比控制

cpp
// 设置最大纵横比
imageCard->setMaximumAspectRatio(1.7);

// 控制是否保持纵横比
imageCard->setIsPreserveAspectCrop(true);

高级用法

1. 自定义渲染

cpp
class CustomImageCard : public ElaImageCard {
protected:
    void paintEvent(QPaintEvent* event) override {
        QPainter painter(this);
        painter.setRenderHints(
            QPainter::SmoothPixmapTransform | 
            QPainter::Antialiasing
        );
        
        // 绘制背景
        QPainterPath path;
        path.addRoundedRect(rect(), 
            getBorderRadius(), 
            getBorderRadius());
        painter.setClipPath(path);
        
        // 自定义绘制逻辑
        if (getIsPreserveAspectCrop()) {
            // 计算纵横比
            qreal aspectRatio = (qreal)width() / height();
            if (aspectRatio < getMaximumAspectRatio()) {
                // 处理纵横比限制
                // ...
            }
        }
        
        // 绘制图片
        painter.drawImage(rect(), getCardImage());
    }
};

2. 主题适配

cpp
// 连接主题变化信号
connect(ElaTheme::getInstance(), 
    &ElaTheme::themeModeChanged,
    this, [=](ElaThemeType::ThemeMode mode) {
        // 更新主题相关样式
        update();
});

图片处理算法

纵横比裁剪

cpp
if (isPreserveAspectCrop) {
    qreal itemAspectRatio = (qreal)width() / height();
    if (itemAspectRatio < maximumAspectRatio) {
        // 使用最大纵横比
        qreal cropHeight = image.width() / maximumAspectRatio;
        painter.drawImage(
            QRect(0, 0, height() * maximumAspectRatio, height()),
            image,
            QRectF(0, 0, image.width(), cropHeight)
        );
    } else {
        // 使用当前纵横比
        qreal cropHeight = image.width() / itemAspectRatio;
        painter.drawImage(
            rect(),
            image,
            QRectF(0, 0, image.width(), cropHeight)
        );
    }
}

注意事项

  1. 图片自动缩放适应
  2. 保持纵横比时会裁剪图片
  3. 最小尺寸限制
  4. 主题切换自动更新
  5. 抗锯齿渲染
  6. 平滑缩放
  7. 圆角裁剪
  8. 性能优化

最佳实践

  1. 使用合适的图片尺寸
  2. 控制纵横比范围
  3. 注意内存使用
  4. 合理设置圆角
  5. 优化图片质量
  6. 处理主题切换
  7. 考虑性能影响
  8. 适当缓存图片

相关组件

  • QPainter: 绘制系统
  • QPainterPath: 路径绘制
  • QImage: 图片处理
  • ElaTheme: 主题管理