[Interest] TextMetrics give wrong metrics for some strings
Elvis Stansvik
elvstone at gmail.com
Mon Mar 21 13:14:58 CET 2016
2016-03-21 11:09 GMT+01:00 Jens Bache-Wiig <jensbw at gmail.com>:
>
>> 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.
Excellent. This was exactly the simplification I was looking for. Works great.
Elvis
>
> Cheers,
>
> Jens Bache-Wiig
> Cutehacks
>
>
>
>
>
More information about the Interest
mailing list