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
}
}
}
}
}
Text
иTextMetrics
используют несколько разных предположений, которые я не смог полностью понять. Другие варианты: вы можете использоватьText
вместоTextMetrics
и скрыть его за пределами экрана или нулевую непрозрачность. Или создайте временный элементText
с помощью Qt.createQmlObject(), измерьте его ширину (сохраните его свойствоimplicitWidth
), затем вызовите для него destroy(). Не идеально, но работает - person Mark Ch   schedule 06.10.2017