使用QPainter的drawText()方法绘制文本时如何垂直居中文本?

4

我在给图片居中文本时的策略是获取该文本的边界矩形,然后将宽度或高度除以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();
}

这是结果——文字在下划线下方而非居中对齐于行:
Android:
image description
Windows:
image description 我使用线条根据度量矩形绘制文本框架: image description 预期的结果是将可见文本精确地居中对齐于给定的点或线: image description 为了让你有一个全面的了解,这就是我目前面临的实际问题
image description
数字应该在行的中央,而不是太低。
我使用的函数返回包括重音和其他大字符在内的尺寸,而这些字符并不存在。如何仅获取存在的字符所占的像素矩形?
1个回答

2
“不太确定你的问题是什么,但如果你问为什么边界矩形看起来不对,那是因为你没有考虑字体中带有重音符号的字符,例如 é、å 等。从字体度量返回的边界矩形包括这些字符。”
“正如 boundingRect 文档 中所述。”

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

“对于 tightBoundingRect 并非如此,我期望它将提供正确的结果。”

我会尝试。但是我想知道 - 我发布了完整的工作代码,错误和正确(预期)结果的图像。我还能做什么使主题更清晰?或者有什么不清楚的地方吗? - Tomáš Zato
问题的标题表明文本应该是垂直绘制而不是水平绘制。你所看到的结果包括一个手机状态栏,这使问题变得模糊不清,你所看到的与预期结果之间的差异非常微小,因此加入一个差异描述会有所帮助。如果我提出这个问题,我会问:“为什么边界框超出可见字符的像素?” - TheDarkKnight
但我知道为什么矩形会扩展,我需要的是正确的解决方案。我会尝试改进问题。 - Tomáš Zato
好的,但是这个问题并没有表明你意识到矩形高度的原因。在这种情况下,我建议陈述以下内容会更好:“由于返回的边界矩形超出了字符范围,以考虑字体中的重音,哪种方法可以提供仅适用于可见文本的边界矩形?” - TheDarkKnight
我改进了这个问题。我还测试了tightBoundingRect,看起来它正在工作。 - Tomáš Zato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接