C++/Qt 在QLabel上最大化渲染文字或图片

/**
* @brief 将字符串以最大化渲染出贴图覆盖在QLabel上
* @param obj QLabel
* @param text 需要最大化渲染的字符串
* @param align 对齐
* @param color 颜色
*/
void LabelFontMax(QObject* obj, QString text, Qt::AlignmentFlag align, Qt::GlobalColor color)
{
    QLabel* label = qobject_cast<QLabel*>(obj);
    assert(label != nullptr);
    QSize size = label->size();
    // 计算字符最大宽度
    int maxTextWidth = size.width() - 20;
    // 计算字符最大高度
    int maxTextHeight = size.height() - 20;
    // 计算字符最大宽度和高度
    QSize maxTextSize(maxTextWidth, maxTextHeight);
    // 计算字符最大宽度和高度下的字体大小
    QFont font = label->font();
    font.setPointSize(5);
    QFontMetrics fm(font);
    int fontSize = fm.height();
    // 计算字符最大宽度和高度下的字体大小
    while (fm.size(Qt::TextSingleLine, text).width() < maxTextWidth && fm.size(Qt::TextSingleLine, text).height() < maxTextHeight) {
        fontSize++;
        font.setPointSize(fontSize);
        fm = QFontMetrics(font);
    }
    fontSize--;
    font.setPointSize(fontSize);
    fm = QFontMetrics(font);

    // 渲染字符串到pixmap中
    QPixmap pixmap(maxTextWidth, maxTextHeight);
    pixmap.fill(Qt::transparent);
    QPainter painter(&pixmap);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    painter.setFont(font);
    painter.setPen(color);
    painter.drawText(pixmap.rect(), align, text);

    // 将pixmap设置为label的背景
    label->setPixmap(pixmap);
}

/**
* @brief 将图片以最大化渲染出贴图覆盖在QLabel上
* @param obj QLabel
* @param path 图片路径
*/
void LabelImageMax(QObject* obj, QString path)
{
    QLabel* label = qobject_cast<QLabel*>(obj);
    int max = qMax(label->width(), label->height());
    QImage image;
    // 如果是svg文件,先无损等比例放大
    if (path.endsWith(".svg")) {
        QSvgRenderer svgRender(path);
        image = QImage(max, max, QImage::Format_ARGB32);
        image.fill(Qt::transparent);
        QPainter painter(&image);
        svgRender.render(&painter);
    } else {
        image.load(path);
    }
    label->setPixmap(QPixmap::fromImage(image.scaled(label->size(), Qt::KeepAspectRatio)));
}

/**
* @brief 将图片以最大化渲染出贴图覆盖在QLabel上
* @param obj QLabel
* @param image 图片
*/
void LabelImageMax(QObject* obj, const QImage& image)
{
    QLabel* label = qobject_cast<QLabel*>(obj);
    label->setPixmap(QPixmap::fromImage(image).scaled(label->width(), label->height(), Qt::KeepAspectRatio));
}
  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值