使用QPainter的drawText()

时间:2016-01-13 10:26:24

标签: qt qpainter qfontmetrics

我的策略是在图像上居中文本时获取该文本的边界矩形并将宽度或高度除以2。在这种情况下我做了同样的事情。这是我创建的示例:

void CanvasWidget::paintEvent(QPaintEvent*)
{
    //Create image:
    QImage image(rect().width(), rect().height(), QImage::Format_RGB32);
    QPainter paint(&image);
    // White background
    image.fill(QColor("#FFF"));
    // set some metrics, position and the text to draw
    QFontMetrics metrics = paint.fontMetrics();
    int yposition = 100;
    QString text = "Hello world.";
    // Draw gray line to easily see if centering worked
    paint.setPen(QPen(QColor("#666"), 1, Qt::SolidLine, Qt::FlatCap, Qt::RoundJoin));
    paint.drawLine(0, yposition, image.width(), yposition);
    // Get rectangle
    QRect fontRect = metrics.boundingRect(text);
    // Black text
    paint.setPen(QPen(QColor("#000"), 1, Qt::SolidLine, Qt::FlatCap, Qt::RoundJoin));
    // Add half the height to position (note that Qt has [0,0] coordinates at the bottom of the image
    paint.drawText(4, yposition+round(((double)fontRect.height())/2.0), text);


    QPainter p(this);
    p.drawImage(rect(), image, image.rect());
    p.end();
}

这是结果 - 文本在线下而不是以线为中心:

<子>机器人:
image description
<子>窗:
image description

我使用线条根据指标矩形在文本周围绘制框架:

image description

预期的结果是将可见文字精确地围绕给定的点/线:

image description

为了让您了解,这是我遇到的实际问题:
image description
数字应该在行的中间,而不是在下面。

我正在使用的功能返回大小,包括重音和不存在的其他大字符。如何才能获得的矩形仅适用于那里的字符

1 个答案:

答案 0 :(得分:2)

不太确定你在问什么,但如果这就是为什么边界矩形出现错误,那是因为你没有考虑字体中有重音符的字符,如é,å等。返回的边界矩形来自字体指标包括这些。

正如boundingRect documentation

中所述
  

边界矩形的高度至少与height()返回的值一样大。

tightBoundingRect的情况并非如此,我预计会提供正确的结果。