Qt 定位包装文本最后一行的边缘

Qt 定位包装文本最后一行的边缘,qt,qml,qtquick2,Qt,Qml,Qtquick2,我有一个QMLText对象,其宽度和包装线受限制: 文本{ 宽度:200;高度:200;wrapMode:Text.WordWrap 文本:“这是我们所知道的世界末日,我感觉很好。” 长方形{ 宽度:parent.contentWidth; 高度:parent.contentHeight; 边框。颜色:“红色”;颜色:“透明” } } 我想计算最后一个周期在哪里(或者就在它的右边)。我尝试使用TextMetrics,但它不支持包装(而且在任何情况下都只会给我一个整体边界框)。我尝试使用读取最

我有一个QML
Text
对象,其宽度和包装线受限制:

文本{
宽度:200;高度:200;wrapMode:Text.WordWrap
文本:“这是我们所知道的世界末日,我感觉很好。”
长方形{
宽度:parent.contentWidth;
高度:parent.contentHeight;
边框。颜色:“红色”;颜色:“透明”
}
}
我想计算最后一个周期在哪里(或者就在它的右边)。我尝试使用
TextMetrics
,但它不支持包装(而且在任何情况下都只会给我一个整体边界框)。我尝试使用读取最后一行的宽度,但所有行的宽度与整个
文本的宽度相同

如何找到最后一行右下角的X,Y坐标


编辑:根据要求,这里有一个测试用例显示,
lineLaidOut
信号不能用于测量实际使用的
宽度

import QtQuick 2.7
import QtQuick.Window 2.2

Window {
    id:app; visible:true; width:300; height:300
    property string message: "It's the end of the world as we know it, and I feel fine."
    Text {
        id:words; x:10; y:10
        width:150; height:150; wrapMode:Text.WordWrap
        onLineLaidOut: console.log((line.number+1)+"/"+lineCount,line.width)
        Rectangle {
            width:parent.contentWidth; height:parent.contentHeight;
            border.color:'red'; color:'transparent'
        }
    }
    Timer {
        property int chars:0
        interval:200; running:true; repeat:true
        onTriggered: words.text=message.substring(0,++chars);
    }
}
其输出显示
line.width
始终是文本对象的全宽,甚至在第一行完全填充之前:

qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 1/1 150
qml: 2/1 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 1/2 150
qml: 2/2 150
qml: 3/2 150
qml: 1/3 150
qml: 2/3 150
qml: 3/3 150
qml: 1/3 150
qml: 2/3 150
qml: 3/3 150
qml: 1/3 150
qml: 2/3 150
qml: 3/3 150
qml: 1/3 150
qml: 2/3 150
qml: 3/3 150

我找到了一个疯狂的解决方案,但它对我有效

function findEndOfWrappedText(label) {
    var x = 0
    var y = 0
    var fakeLink = "<a href='f'>█</a>"

    var finder = function(line) {
        if (line.number !== label.lineCount - 1)
            return

        for (var i = 0; i < label.width; ++i) {
            if (label.linkAt(line.x + i, line.y + (line.height / 2))) {
                x = line.x + i
                y = line.y
                break
            }
        }
    }

    label.lineLaidOut.connect(finder)
    label.text = label.text + fakeLink
    label.lineLaidOut.disconnect(finder)
    label.text = label.text.substring(0, label.text.length - fakeLink.length)
    return Qt.point(x,y)
}

如果您有更好的解决方案,请随意修正我的想法:)

我找到了一个疯狂的解决方案,但它对我有效

function findEndOfWrappedText(label) {
    var x = 0
    var y = 0
    var fakeLink = "<a href='f'>█</a>"

    var finder = function(line) {
        if (line.number !== label.lineCount - 1)
            return

        for (var i = 0; i < label.width; ++i) {
            if (label.linkAt(line.x + i, line.y + (line.height / 2))) {
                x = line.x + i
                y = line.y
                break
            }
        }
    }

    label.lineLaidOut.connect(finder)
    label.text = label.text + fakeLink
    label.lineLaidOut.disconnect(finder)
    label.text = label.text.substring(0, label.text.length - fakeLink.length)
    return Qt.point(x,y)
}

如果您有更好的解决方案,请随时修正我的想法:)

相关问题:请编辑问题以提供使用
onlineaidout
的测试用例。然后将它作为Qt bug提交,如果它确实不能正常工作。它应该按照您期望的方式工作,但是让我们先看看代码。@KubaOber有趣的是,我不确定
宽度是否应该以这种方式使用。我已经编辑了一个测试用例。FWIW,我已经提交了一个bug(标题为);我们来看看这是否是一个bug。无论如何,我仍然需要一个变通方法(可能使用FontMetrics并手动包装文本:/)。相关问题:请编辑该问题以提供一个使用
OnlineAidout
的测试用例。然后将它作为Qt bug提交,如果它确实不能正常工作。它应该按照您期望的方式工作,但是让我们先看看代码。@KubaOber有趣的是,我不确定
宽度是否应该以这种方式使用。我已经编辑了一个测试用例。FWIW,我已经提交了一个bug(标题为);我们来看看这是否是一个bug。不管怎样,我仍然需要一个变通方法(可能使用FontMetrics并手动包装文本:/)。