[Interest] TextMetrics give wrong metrics for some strings
Jens Bache-Wiig
jensbw at gmail.com
Mon Mar 21 11:09:14 CET 2016
> On 21 Mar 2016, at 10:47, Elvis Stansvik <elvstone at gmail.com> wrote:
>
> 2016-03-21 10:42 GMT+01:00 Elvis Stansvik <elvstone at gmail.com>:
>> 2016-03-21 10:27 GMT+01:00 Elvis Stansvik <elvstone at gmail.com>:
>>> Hi all,
>>>
>>> I'm attempting to make a custom Button item where the size of the
>>> button is determined by the metrics of the text it holds. The reason
>>> is I want to put a thin rectangle below the text, sort of a stylistic
>>> underlining (text underlining is not sufficient, for aesthetic
>>> reasons).
>>>
>>> But I'm seeing strange metrics reported for some strings.
>>>
>>> BEGIN TEST CASE
>>>
>>> Button.qml:
>>>
>>> import QtQuick 2.5
>>>
>>> // Attempt at a button with a size determined by the metrics
>>> // of its text.
>>>
>>> Rectangle {
>>> property alias text: text.text
>>> property alias pointSize: text.font.pointSize
>>>
>>> width: textMetrics.width
>>> height: textMetrics.height
>>>
>>> TextMetrics {
>>> id: textMetrics
>>> font: text.font
>>> text: text.text
>>> }
>>>
>>> Text {
>>> id: text
>>> text: "Button"
>>> }
>>> }
>>>
>>>
>>> Test.qml:
>>>
>>> import QtQuick 2.5
>>>
>>> Rectangle {
>>> width: 800
>>> height: 600
>>>
>>> // Something wrong with the metrics on this one :/
>>>
>>> Button {
>>> text: "Hej"
>>> pointSize: 42
>>> border.color: "red"
>>>
>>> anchors.top: parent.top
>>> }
>>>
>>> // These two seem OK.
>>>
>>> Button {
>>> text: "Something longer"
>>> pointSize: 42
>>> border.color: "red"
>>>
>>> anchors.verticalCenter: parent.verticalCenter
>>> }
>>>
>>> Button {
>>> text: "Test"
>>> pointSize: 42
>>> border.color: "red"
>>>
>>> anchors.bottom: parent.bottom
>>> }
>>> }
>>>
>>> END TEST CASE
>>>
>>> See the attached screenshot (metrics_are_off.png) which shows the
>>> result. Notice how the size of the buttons (Rectangle) are correct for
>>> the last two buttons, but for the first, the text is sticking out a
>>> little :/
>>>
>>> Any idea why this is, and how I can solve it?
>>>
>>> I'm also attaching a sketch (sketch.png) of the look I'm after for my
>>> buttons. If you know of a simpler way to achieve this, I'm idle ears.
>>
>> Nevermind. I realize now that the metrics are actually correct, it's
>> just that the 'H' in "Hej" has some leading space, which seems to not
>> be included in the reported metrics.
>>
>> I'll have to rethink a little, but should get it to work now I think.
>> Still would appreciate if someone who's done something similar to what
>> I'm trying could chime in.
>
> Actually, I guess my question is now; how can I account for this
> leading space? I.e. how can I get the position where the string
> (visually) starts and ends in the X direction? In the "Test" and
> "Something longer" case, the TextMetrics seems pretty accurate, but
> the leading space that the 'H' has (in the font I guess) seems to not
> be included in the metric rect :/
>
> Elvis
In most cases you do not actually need to use TextMetrics explicitly in the way that you are doing here. The Text item already has a built in “implicitWidth” and “implicitHeight” properties that accounts for font metrics and any leading/trailing space you need. Unless I am missing something, all you need to do to make your example work is to simplify your button to this:
Rectangle {
property alias text: text.text
property alias pointSize: text.font.pointSize
width: text.implicitWidth
height: text.implicitHeight
Text {
id: text
text: "Button"
}
}
That said, you probably want some extra margins around the text label in most cases regardless.
Cheers,
Jens Bache-Wiig
Cutehacks
More information about the Interest
mailing list