我上传了一个文本文件,并将内容解析为文本对象。最终我将把字符串中的每个字符传递给它自己的矩形。我想弄清楚如何从qml中的字符串中选择一个字符?
例如:
//Assume the text is already parsed from the file and it is stored in the object below
Text {
id:myText
text: "The quick brown fox jumps over the lazy dog"
visible:false
}
// And now i would like to transfer the first letter into a rectangle
Rectangle{
id: firstRect
width:rectText.width
height:rectText.height
color: "yellow"
Text {
id:rectText
text: // How do I set this as the first character 'T'
font.pixelSize: 14
color: "black"
}
}
如何使用 myText 中的字符将矩形设置为 rectText ? 最终我将把每个角色设置为自己的矩形。
答案 0 :(得分:3)
几乎不可能。至少不是通过使用为QML提供的小字体度量功能。自Qt 5.4以来TextMetrics
可用,但由于某种原因,它没有准确报告文本大小,至少对于我一直在使用的字体。它可能与this issue有关。我最终通过将字符附加到查询文本来获得准确的结果,我甚至不想详细说明我是如何理解的。
然后,如果这恰好工作,你只有文本尺寸,但没办法确定那个矩形的位置,因为QML文本元素只能给你光标位置,但不能给你任何特定字符的位置。如果你只有一行文字就可以了 - 只需计算前面文字的宽度,但对于多行来说这是不行的。
您可能需要采取一种非常不同的方法。也许实现一个将字符串作为列表模型呈现的适配器,并将每个单独的字符表示为流式视图中的QML元素。
但是对于长文本而言,为每个字符设置一个离散的可视项目将是巨大的开销,因此如果您将要有这样的文本,您还必须处理仅显示文本的特定部分的模型代理。 / p>
我现在无法想到获得有关文字字符位置和大小的准确信息的其他方法。 API根本没有这个功能。
有一个简单的例子完全适用于短文:
ApplicationWindow {
id: main
width: 640
height: 480
visible: true
property var charlist: textfield.text.split('')
property int currentChar: 0
Column {
TextField {
width: main.width
id: textfield
text: "example text"
}
Flow {
width: main.width
height: 200
Repeater {
model: charlist
delegate: Rectangle {
Text { id: tt; text: modelData; font.pointSize: 20 }
width: tt.width
height: tt.height
color: "red"
border.color: index === currentChar ? "black" : "red"
MouseArea {
anchors.fill: parent
onClicked: {
currentChar = index
var pos = mapToItem(main.contentItem, 0, 0)
info.text = "rectangle x y w h: " + pos.x + ", " + pos.y + ", " + width + ", " + height
}
}
}
}
}
Text {
id: info
}
}
}
您可以在文本字段中输入任意文本,该文本字段将由为每个字符创建项目的模型视图表示。单击一个字符将"选择"它还将为您提供与其在应用程序窗口中的位置相对应的矩形值。