qml TextMetrics не размещает пробелы так же, как Text

TextMetrics должен сообщать вам размер отображаемой текстовой строки, но, похоже, он не соответствует тому, как текст на самом деле отображается с помощью Text, особенно если строка содержит пробелы. Проблема очень серьезна с некоторыми шрифтами и настройками pointSize или pixelSize, но исчезает с другими шрифтами или размерами.

Следующий код создает Retangles точно такой же высоты и ширины, как boundingRect, возвращаемый TextMetrics, который должен покрывать каждый пиксель отображаемого текста.

Но эти прямоугольники немного уже, чем отображаемый текст, из-за чего последний символ свисает за пределы прямоугольника, где он перекрывается следующим прямоугольником (последний символ 'd' виден за пределами прямоугольника). край последнего прямоугольника).

Как это исправить?

Есть ли надежный способ узнать точно ограничивающую рамку для отображаемой текстовой строки?

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3

ApplicationWindow {
    visible: true
    width: 800
    height: 100
    color: "grey"

    TextMetrics {
        id: metrics
        font.family: "Helvetica" // or try "Ubuntu"
        //font.pixelSize: 12
        font.pointSize: 14
        text: "H                      d"  // more spaces causes more corruption
    }

    Row {
        Repeater {
            model: 5
            Rectangle {
                clip: false
                color: "yellow"
                width: metrics.boundingRect.width
                height: metrics.boundingRect.height
                Text {
                    text: metrics.text
                    font: metrics.font
                }
            }
        }
    }
}

введите здесь описание изображения


qml
person jimav    schedule 05.10.2017    source источник
comment
только что попробовал ваш пример в Windows с Qt 5.9.1, и он работает, как и ожидалось! Так что я думаю, что это может быть ошибка, связанная с Linux.   -  person luffy    schedule 06.10.2017
comment
Text и TextMetrics используют несколько разных предположений, которые я не смог полностью понять. Другие варианты: вы можете использовать Text вместо TextMetrics и скрыть его за пределами экрана или нулевую непрозрачность. Или создайте временный элемент Text с помощью Qt.createQmlObject(), измерьте его ширину (сохраните его свойство implicitWidth), затем вызовите для него destroy(). Не идеально, но работает   -  person Mark Ch    schedule 06.10.2017


Ответы (1)


Решение @MarkCh в комментариях к вопросу - это то, что сработало для меня, хотя оно проще, чем добавление элемента TextMetrics. Это мое полное решение:

Rectangle {
    clip: false
    color: "yellow"
    width: text.contentWidth
    height: text.contentHeight
    Text {
        id: text
        text: "H                      d"
        anchors.fill: parent
    }
}
person Neptilo    schedule 09.11.2020