在QML中,我希望将一些文本放入有限的空间中。此文本包含本地化,静态和可变部分(文件名)。可变部分可能太长而无法适应我所拥有的空间,如果发生这种情况,应该省略它。允许第一部分换行到新行并且本地化可能会这样做。
我现在的问题如下:两个文本都在Flow容器中,目的是将文件名附加到静态文本。但是,如果第一个文本部分换行,则整个文本具有我可用的最大宽度,并且文件名将被放在一个新行上,即使第一个部分的最后一行没有完全填充该空格。看到这张图片:
代码:
Flow {
width: parent.width
spacing: 4
Text {
width: (contentWidth <= parent.width) ? contentWidth : parent.width
text: qsTr("A string that might or might not wrap, depending on localisation")
wrapMode: Text.WordWrap
}
Text {
width: (contentWidth <= parent.width) ? contentWidth : parent.width
text: fileName
color: customColor
elide: Text.ElideMiddle
// ... more options
MouseArea {
anchors.fill: parent
onClicked: //stuff
}
}
}
是否可以使用最后一行的剩余空间?
编辑:这是它应该看起来的样子:
答案 0 :(得分:2)
我提出的唯一方法是非常黑客。
问题是,Text
是一个对象,周围有一个矩形边界框。 Flow
使用此边界框进行定位。
我的hacky解决方案背后的想法是,用单个单词分解文本,然后由Flow
定位。现在Flow
知道最后一个单词的结束位置,因此可以将下一个Text
放在后面。
Flow {
id: flw
property string text: "Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat. Quis aute iure reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint obcaecat cupiditat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
width: 300
spacing: fnt.advanceWidth(' ')
FontMetrics {
id: fnt
}
Repeater {
id: rep
model: flw.text.split(' ')
delegate: Text {
font: fnt.font
text: modelData
}
}
Text {
text: "C:/Some/Path/To/The/File/In/Question/File.extension"
color: 'green'
width: {
var neighbor = rep.itemAt(rep.count - 1)
parent.width - neighbor.x - neighbor.width - parent.spacing
}
elide: Text.ElideMiddle
}
}