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