You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt5 QML中Text控件截断后自定义省略号样式的实现方法

解决Qt5 QML Text控件自定义省略号样式问题

默认的Text.ElideRight生成的省略号是Unicode的“…”字符,若需要替换为自定义样式(如三个英文点“...”),或调整截断逻辑匹配需求,可通过以下两种方式实现:

方法一:直接替换默认省略号

利用TextMetrics生成截断文本后,替换默认省略号为自定义样式:

Text {
    Layout.topMargin: 5
    Layout.preferredWidth: parent.width
    Layout.preferredHeight: columnsItem.titleHeight
    font: Style.h4
    wrapMode: Text.Wrap
    maximumLineCount: 2
    lineHeight: 1.5

    // 提取原始文本,方便复用
    property string originalTitle: BodyViewModelCpp.findMusicPageColumns.getSubitemProperty(modelData, "title")

    text: {
        // 创建TextMetrics实例计算文本显示情况
        let tm = Qt.createQmlObject('import QtQuick 2.15; TextMetrics {}', this)
        tm.font = font
        tm.width = width
        tm.wrapMode = Text.Wrap
        tm.maximumLineCount = 2

        // 生成默认截断文本,替换省略号为自定义样式
        let elidedText = tm.elidedText(Qt.TextElideRight, width)
        return elidedText.replace(/…$/, '...') // 将默认“…”替换为“...”
    }
}

方法二:自定义截断逻辑(更灵活)

若默认截断位置不符合需求,可手动计算两行文本的容纳范围,精准控制截断点和省略号:

Item {
    Layout.topMargin: 5
    Layout.preferredWidth: parent.width
    Layout.preferredHeight: columnsItem.titleHeight

    // 原始文本
    property string originalTitle: BodyViewModelCpp.findMusicPageColumns.getSubitemProperty(modelData, "title")

    // 计算文本显示状态的TextMetrics
    TextMetrics {
        id: titleMetrics
        font: Style.h4
        width: parent.width
        wrapMode: Text.Wrap
        maximumLineCount: 2
        text: originalTitle
    }

    // 显示完整文本(未超出时)
    Text {
        id: fullTitle
        anchors.fill: parent
        font: Style.h4
        wrapMode: Text.Wrap
        maximumLineCount: 2
        lineHeight: 1.5
        text: originalTitle
        visible: !titleMetrics.elided
    }

    // 显示带自定义省略号的截断文本(超出时)
    Text {
        id: truncatedTitle
        anchors.fill: parent
        font: Style.h4
        wrapMode: Text.Wrap
        maximumLineCount: 2
        lineHeight: 1.5
        visible: titleMetrics.elided
        text: {
            let tm = Qt.createQmlObject('import QtQuick 2.15; TextMetrics {}', this)
            tm.font = font
            tm.width = width
            tm.wrapMode = Text.Wrap

            // 获取第一行完整文本
            let firstLineEnd = tm.lineAt(0).length
            let firstLine = originalTitle.substring(0, firstLineEnd)

            // 计算第二行可容纳的文本,去掉默认省略号后添加自定义样式
            tm.text = originalTitle.substring(firstLineEnd)
            let secondLine = tm.elidedText(Qt.TextElideRight, width).replace(/…$/, '')

            return `${firstLine}\n${secondLine}...`
        }
    }
}

补充说明

如果需要特殊样式的省略号(如不同字体、颜色),可将省略号单独用Text控件叠加在文本末尾,通过anchors定位到第二行右侧即可。注意确保TextMetrics的font、width、wrapMode属性与显示文本的Text控件完全一致,避免计算偏差。

内容的提问来源于stack exchange,提问作者黄滨滨

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:31:01