Центрируйте текст по вертикали при рисовании с помощью drawText() QPainter

Моя стратегия при центрировании текста на изображениях состоит в том, чтобы получить ограничивающий прямоугольник для этого текста и разделить ширину или высоту на два. Я сделал то же самое в этом случае. Это пример, который я создал:

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:
Описание изображения
Окна:
Описание изображения

Я использовал линии, чтобы нарисовать рамку вокруг текста на основе метрики прямоугольника:

Описание изображения

Предполагаемым результатом было центрирование видимого текста точно вокруг заданной точки / линии:

Описание изображения

Чтобы представить вас в перспективе, это актуальная проблема, с которой я столкнулся:
Описание изображения
Цифры должны быть в середине строк, а не намного ниже.

Функция, которую я использую, возвращает размер, включая акценты и другие большие символы, которых там нет. Как получить прямоугольник в пикселях только для символов, которые там есть?

1 ответ

Решение

Не совсем уверен, о чем вы спрашиваете, но если именно поэтому ограничивающий прямоугольник выглядит неправильно, то это потому, что вы не учитываете символы с акцентами в шрифте, такие как é, å и т. Д. Ограничительный прямоугольник возвращается из метрик шрифта. включает в себя эти

Как говорится в документации boundingRect

Высота ограничивающего прямоугольника, по крайней мере, равна значению, возвращаемому функцией height().

Это не тот случай, если я думаю, что OverboundingRect даст правильный результат.

Другие вопросы по тегам