Центрируйте текст по вертикали при рисовании с помощью 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 даст правильный результат.