目录
背景:
当用到QTextEdit控件进行文本输入时,有时候需要与其他行为进行交互,则需要计算当前QTextEdit中内容的高度。
此时,计算的高度与文本换行的真实情况对不上,计算出来的文本高度是错误的!现在来分析下原因:
遇到问题:
在这里提供两种QTextEdit输入文本高度的方法:
1、QFontMetrics
使用QFontMetrics::boundingRect是一种计算文本高度的有效方法,通过计算给定文本在指定区域内的包围矩形来确定文本的尺寸,尤其是需要计算多行文本的高度时:
QFontMetrics fontMetrics(font);
QRect boundingRect = fontMetrics.boundingRect(
QRect(0, 0, editorWidth, 0),
Qt::AlignLeft,
text
);
该方法需要输入:字体font、输入文本的控件宽度editorWidth(在这里也就是当前QTextEdit显示文本的宽度)、文本内容text。
输出:boundingRect.height()为我们需要计算的输入文本高度。
2、QTextLayout
QTextLayout textLayout(text, font);
textLayout.beginLayout();
qreal height = 0;
while (true) {
QTextLine line = textLayout.createLine();
if (!line.isValid()) {
break;
}
line.setLineWidth(editorWidth);
height += line.height();
}
textLayout.endLayout();
该方法需要输入:字体font、输入文本的控件宽度editorWidth(在这里也就是当前QTextEdit显示文本的宽度)、文本内容text。
输出:height为我们需要计算的输入文本高度。
问题出现:
当通过实例,我们通常会发现,计算出来的高度和实际控件换行的时机是不一样的,也就是说计算出来的高度是不准确的。
问题分析:
当我们通过上述方法来计算输入多行文本的高度时,输入都需要当前控件的输入文本所占有的宽度(也就是说可用来显示单行文本的最大宽度)。当计算方法中的editorwidth宽度没有与QTextEdit控件所显示文本的宽度一致,所计算出来的高度的确是不正确的。
当前我们可以想到的最直接的方法是将QTextEdit控件的内边距全部清零,那应该用什么方法呢?使用setContentsMargins?
QT文档:
(1)setContentsMargins:
可以通过官方QT文档知道:setContentsMargins方法的确可以用于设置控件内容的边距,但是它的作用范围是控件的布局系统,而不是直接影响QTextEdit的文档内容显示区域。换句话,影响的是控件与其他控件之间的间距,而不是控件内部的内容边距。
另外,查阅QT文档可知:
QTextDocument下的documentMargin方法:
官方有做说明:该方法主要设置围绕文档的边距。默认为 4。这个值会影响输入文本计算的实际高度。
解决方法:
当上述计算多行文本的高度与实际高度不一致时,我们可以先将控件输入文本的内边距去掉,也就是通过setDocumentMargin方法。当然,如果需要设置边距也可以,只要与之对应即可。
通过这样来保证此时控件实际显示文本的宽度是与计算方法中的editorWidth值是一致地。这样下来,计算出来的文本高度是正确的!