Qt C ++如何使用QPainter将文本缩放到宽度

时间:2017-11-18 22:03:25

标签: c++ qt qpainter

我正在寻找一种根据QRect使用QPainter的drawText方法的有效方法。例如,如果我将QRect作为原点,尺寸为50x50:QRect(0, 0, 50, 50);并且想要适合文本,那么它从左到右适合。以下是我目前拥有的一些例子,但在任何程度上我都不能让它们流畅地移动。

示例1:

font.setStyleHint(QFont::AnyStyle, QFont::PreferAntialias);
painter.setRenderHint(QPainter::TextAntialiasing);

QStyleOptionGraphicsItem option;
qreal lod = option.levelOfDetailFromTransform(painter.worldTransform());
QRectF r = textRect;
QFont f = font;
qreal aspectRatio = painter.fontMetrics().lineSpacing() / painter.fontMetrics().averageCharWidth();
int pixelsize = sqrt(r.width() * r.height() / aspectRatio / (m_text.length() * 3)) * aspectRatio;
f.setPixelSize(pixelsize);
int flags = Qt::AlignCenter | Qt::TextDontClip | Qt::TextWordWrap;
if ((pixelsize * lod) < 13)
    flags |= Qt::TextWrapAnywhere;
QFontMetricsF fm(f);
QRectF tbr = fm.boundingRect(r, flags, m_text);
pixelsize = f.pixelSize() * qMin(r.width() * 0.65 / tbr.width(), r.height() * 0.65 / tbr.height());
f.setPixelSize(pixelsize);
painter.setFont(f);
painter.drawText(r, flags, m_text);

然而,这让我感到不稳定的紧张文本。

示例2:

float factor = (rectangle.width() / painter.fontMetrics().width(m_text))/2;
if ((factor < 1) || (factor > 1.25))
{
    font.setPointSizeF(font.pointSizeF()*factor);
    painter.setFont(font);
}
QPainterPath textPath;
textPath.addText(textRect.topLeft(), font, m_text);
painter.drawPath(textPath);

示例3:

QImage image(size(), QImage::Format_ARGB32_Premultiplied);
{
    QPainter p(&image);
    p.setRenderHint(QPainter::TextAntialiasing);

    QFont font;
    font.setFamily("Roboto medium");
    font.setPointSize((double)scalar/10);
    font.setStyleHint(QFont::Helvetica, QFont::PreferAntialias);

    p.setPen(Qt::black);
    p.setFont(font);

    p.drawText(rect(), Qt::AlignLeft , m_text);
}
painter.drawImage(rectangle, image);

老实说,我正在使用这些方法制作圆形按钮,可以有文字,文字+图标,也可以只有图标。我希望它们具有可扩展性。任何可以这样做的方法都将非常感激。非常感谢你。

0 个答案:

没有答案