如何正确计算QTextEdit控件中输入多行内容的高度

目录

背景:

遇到问题:

1、QFontMetrics

2、QTextLayout

问题出现:

问题分析:

QT文档:

解决方法:


背景:

当用到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值是一致地。这样下来,计算出来的文本高度是正确的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值