QML:如何在不截断字符的情况下截断字符串?

QML: How to truncate a string without cutting off characters?

我正在尝试按指定长度截断字符串而不截断任何单词。我尝试使用正则表达式来执行此操作,但是当我尝试使用变量来指定我希望字符串的长度时,它似乎不起作用。这是我的 QML 代码:

import QtQuick 2.0

Rectangle {
    id: background
    property string contactName: "John Doe"
    property string lastText: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Hac habitasse platea dictumst quisque sagittis purus sit. Enim nunc faucibus a pellentesque."
    property int lastTextMaxLen: 40

    Image {
        id: contactPhoto
        width: 100
        anchors.left: parent.left
        anchors.top: parent.top
        anchors.bottom: parent.bottom
        source: "qrc:/qtquickplugin/images/template_image.png"
        anchors.bottomMargin: 25
        anchors.topMargin: 25
        anchors.leftMargin: 25
        fillMode: Image.PreserveAspectFit
    }


    Rectangle {
        id: rectangle
        y: 25
        height: 100
        color: "#ffffff"
        anchors.verticalCenter: parent.verticalCenter
        anchors.left: contactPhoto.right
        anchors.right: parent.right
        anchors.rightMargin: 20
        anchors.leftMargin: 15
        anchors.verticalCenterOffset: 0

        Text {
            id: contactNameTxt
            width: 90
            height: 25
            text: contactName
            anchors.left: parent.left
            anchors.top: parent.top
            font.pixelSize: 20
            anchors.leftMargin: 0
            anchors.topMargin: 25
            font.bold: true
        }

        Text {
            id: lastTextPreview
            text: lastText.replace(new RegExp("/^(.{"+lastTextMaxLen+"}[^\s]*).*/"), "")
            anchors.top: contactName.bottom
            anchors.bottom: parent.bottom
            font.pixelSize: 15
            wrapMode: Text.NoWrap
            anchors.bottomMargin: 20
            anchors.topMargin: 10


        }
    }
}

当我使用上面的代码时,无论我为 lastTextMaxLen 设置的数字如何,我的文本都会完整显示。然而,如果我替换行:

text: lastText.replace(new RegExp("/^(.{"+lastTextMaxLen+"}[^\s]*).*/"), "")

与:

text: lastText.replace(/^(.{40}[^\s]*).*/, "")

它工作得很好。但是,我希望能够在变量中定义截断长度,以便我可以根据小部件大小动态更改它。那么有人能解决我的问题吗?

与文字符号版本相比,您的 new RegExp() 构造函数不起作用的原因是构造函数不应包含开始和结束斜杠 "/.../"。删除这些会导致它按我的预期工作:

text: lastText.replace(new RegExp("^(.{"+lastTextMaxLen+"}[^\s]*).*"), "")

其次,截断字符串以适应给定几何形状的常规 QML 方法是使用名为 elideText 属性,它将在以下位置添加一个“...”如果超过指定宽度,则在字符串末尾。这对于动态缩放的 UI 非常有帮助,并且是推荐的方法。下面是一个小示例,显示将始终截断以保留在灰色矩形内的文本:

Rectangle {
    height: 50
    color: "lightgrey"
    width: parent.width  // Rectangle size fluctuates based on parent size

    Text {
        text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Hac habitasse platea dictumst quisque sagittis purus sit. Enim nunc faucibus a pellentesque."
        anchors.centerIn: parent
        width: parent.width - 10 // binds width to parent width, -10 adds 5px margin to each side after centering
        elide: Text.ElideRight // truncates text that extends past the specified width
    }
}

当框变窄时省略文本:

当框更宽时省略文本:

最后要注意的是 elide 仅在您的 Text 项目具有完全指定的 width 时才有效,这可能意味着明确设置其 width 属性 或给它 anchors.rightanchors.left