[Qt-interest] QFontMetrics boundingRect() vs width()
Nikos Chantziaras
realnc at arcor.de
Fri Jun 18 03:55:50 CEST 2010
On 06/18/2010 04:27 AM, Josh wrote:
> Hello all,
>
> I'm working on some things with text layout and need to better
> understand how text is laid out. Obviously,
> QFontMetrics::boundingRect().width() is different than
> QFontMetrics::width(). What I'm trying to figure out is how they are
> related. For example, if I have a string, "This is a sentence" what
> causes the two values to be different? I thought it would be related to
> QFontMetrics::leftBearing() and rightBearing(), but I can't see any
> relationship there. Is there any way to figure out what the bounding
> rect will be based on the width? Any information about the relationship
> between these will be appreciated! Thanks!
QFontMetrics::width() gives the position at which subsequent text should
be drawn. FontMetrics::boundingRect() gives the real bounding rectangle
of the text. QFontMetrics::width() is usually smaller because of font
kerning. Kerning is the reason QFontMetrics::width() is needed at all.
So if you have a piece of text than you're drawing, and need to know
where to begin drawing subsequent text, use QFontMetrics::width(). To
give an example, imagine you're trying to draw two words, "foo" and
"bar", one after another to form the final word "foobar". You draw
"foo" first at position X, and then draw "bar" at position X +
QFontMetrics::width("foo"). You cannot do this with
QFontMetrics::boundingRect().width("foo"). That would give you the real
width of "foo" rather than the width offset at which to draw the next text.
You can experiment with this and see for yourself. I recommend drawing
the string "Yo", in two steps: "Y" first and then "o". You'll see the
effect of kerning and why QFontMetrics::boundingRect() is not suitable
and will result in ugly spaced text rendering.
More information about the Qt-interest-old
mailing list