【问题标题】:Center text vertically when drawing with QPainter's drawText()使用 QPainter 的 drawText() 绘制时垂直居中文本
【发布时间】:2016-01-13 10:26:23
【问题描述】:

在图像上居中文本时,我的策略是获取该文本的边界矩形并将宽度或高度除以 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:

Windows:

我使用线条在基于度量矩形的文本周围绘制框架:

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

为了让您正确看待,这是我遇到的实际问题:

数字应该在行的中间,而不是在下面。

我使用的函数返回大小,包括重音和其他不存在的大字符。如何仅针对存在的字符获取以像素为单位的矩形?

【问题讨论】:

    标签: qt qpainter qfontmetrics


    【解决方案1】:

    不太确定您要问什么,但如果这就是边界矩形出现错误的原因,那是因为您没有考虑字体中带有重音符号的字符,例如 é、å 等。边界矩形返回from font metrics 包括这些。

    正如boundingRect documentation 中所述

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

    tightBoundingRect 的情况并非如此,我希望它会提供正确的结果。

    【讨论】:

    • 我会试试的。但我想知道 - 我发布了完整的工作代码,错误和正确(预期)结果的图像。我还能做些什么来使主题更清晰?或者有什么不清楚的地方?
    • 问题的标题暗示要垂直绘制文本,而不是水平绘制。您所看到的结果包括电话的状态栏,它会影响问题,并且您所看到的与预期结果之间的差异非常微妙,因此添加对差异的描述会有所帮助。如果我提出这个问题,我会问“为什么边界矩形会延伸到可见字符的像素之上?”
    • 但是我知道矩形为什么会延伸,我需要的是正确的解决方案。我会努力改进这个问题。
    • 好的,但问题并没有表明您知道矩形高度的原因。在这种情况下,我建议说明以下内容将是一个改进“由于返回的边界矩形延伸到字符上方,以考虑字体中的重音,什么方法可以为可见文本提供边界矩形?”
    • 我改进了这个问题。我还测试了tightBoundingRect,它似乎工作正常。
    猜你喜欢
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 2021-07-10
    • 2015-09-16
    相关资源
    最近更新 更多