Это решение, над которым я работаю для этого другого вопроса. Текст должен быть горизонтально и вертикально центрирован в данном rect
.
void
draw_text_label (QPainter & p, const QString & text, QRectF rect)
{
// Work in unscaled coordinates (see linked question if you're curious)
p .save ();
assert (false == p .transform () .isRotating ());
rect = p .transform () .mapRect (rect);
p .resetTransform ();
// Scale to fit
set_font_size (p, font_size_to_fit (p, text, rect));
QRectF text_rect = p .fontMetrics () .tightBoundingRect (text);
////////////////////////////
// this line ALMOST works //
////////////////////////////
text_rect .moveCenter (rect .center ());
// Draw
p .translate (text_rect .left (), text_rect .bottom ());
p .setPen (Qt :: red);
p .drawText (0, 0, text);
p .drawRect (0, 0, text_rect .width (), -text_rect .height ());
p .restore ();
}
Что вызвано
void
draw_thingy (QRectF rect)
{
p .setPen (Qt :: white);
p .drawRect (rect);
float m = MARGIN * 0.5;
draw_text_label (thingy_text, rect .adjusted (m,m,-2*m,-2*m));
}
Таким образом, данный rect
обозначается белым цветом, text_rect
указывается красным цветом.
Как вы можете видеть на этом тестовом изображении (ссылка в случае, когда встроенное изображение умирает), красный прямоугольник не совсем центрирован. Это больше, чем ошибка округления.
Почему это происходит?
Используйте значение выравнивания Qt::AlignCenter
в DrawText
чтобы DrawText
текст в прямоугольнике. Никаких прямых вычислений не требуется.