QML使用具有多行文本的Flow中最后一行的剩余宽度

时间:2017-11-13 16:35:15

标签: qt text formatting qml string-formatting

在QML中,我希望将一些文本放入有限的空间中。此文本包含本地化,静态和可变部分(文件名)。可变部分可能太长而无法适应我所拥有的空间,如果发生这种情况,应该省略它。允许第一部分换行到新行并且本地化可能会这样做。

我现在的问题如下:两个文本都在Flow容器中,目的是将文件名附加到静态文本。但是,如果第一个文本部分换行,则整个文本具有我可用的最大宽度,并且文件名将被放在一个新行上,即使第一个部分的最后一行没有完全填充该空格。看到这张图片:

filename wrapping to new line, even though last line is not filled

代码:

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
        }
    }
}

是否可以使用最后一行的剩余空间?

编辑:这是它应该看起来的样子:

how the text should be formatted

1 个答案:

答案 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
    }
}