#include "IconCaption.h" #include #include #include #include QPixmap renderCaptionWithIcon(const QString& text, const QPixmap& icon, const QFont& font, const QColor& textColor) { const QFontMetrics metrics(font); const int textWidth = metrics.horizontalAdvance(text); const int gap = icon.isNull() ? 0 : 6; // The icon is drawn at the caption's device-independent pixel size; the source // pixmap may be larger (rasterized at a target size / device pixel ratio), so // divide by its own dpr to get its logical size. const qreal iconDpr = icon.isNull() ? 1.0 : icon.devicePixelRatio(); const int iconW = icon.isNull() ? 0 : static_cast(icon.width() / iconDpr); const int iconH = icon.isNull() ? 0 : static_cast(icon.height() / iconDpr); const int width = textWidth + gap + iconW; const int height = qMax(metrics.height(), iconH); const qreal dpr = qApp ? qApp->devicePixelRatio() : 1.0; QPixmap pixmap(static_cast(width * dpr), static_cast(height * dpr)); pixmap.setDevicePixelRatio(dpr); pixmap.fill(Qt::transparent); QPainter painter(&pixmap); painter.setRenderHint(QPainter::Antialiasing, true); painter.setRenderHint(QPainter::SmoothPixmapTransform, true); painter.setFont(font); painter.setPen(textColor); painter.drawText(QRect(0, 0, textWidth, height), Qt::AlignLeft | Qt::AlignVCenter, text); if (!icon.isNull()) { const int iconX = textWidth + gap; const int iconY = (height - iconH) / 2; painter.drawPixmap(QRect(iconX, iconY, iconW, iconH), icon); } return pixmap; }