python QFontMetrics在行与行之间留有额外空间

vyu0f0g1  于 2022-10-30  发布在  Python
关注(0)|答案(1)|浏览(178)

我试图用PySide6的QPainterQFontMetrics绘制多个文本段落。我想用与在一个文本块中绘制时相同的间距来绘制它们,但是行距不太正确。
在下面的示例中,字体规格说明字体的行距为17。当我度量单行文本时,边框的高度确实为17像素。但是,当我度量两行文本时,边框的高度为35像素,而不是34像素。多余的像素是从哪里来的?我可以在字体或字体规格的某个属性上看到它吗?

from PySide6.QtGui import QFont, QFontMetrics
from PySide6.QtWidgets import QApplication

app = QApplication()
font = QFont()
metrics = QFontMetrics(font)
print(metrics.lineSpacing())  # 17
print(metrics.boundingRect(0, 0, 100, 100, 0, 'A').height())  # 17
print(metrics.boundingRect(0, 0, 100, 100, 0, 'A\nB').height())  # 35 != 17 * 2

顺便说一句,并不总是一个额外的像素。如果我把字体变大,额外的空间也会增加。

1yjd4xko

1yjd4xko1#

首先,字体度量的边框高度并不取决于所使用的字符,而是取决于字体规范。
两行文本没有一行边框的height()的两倍:相反,您必须考虑lineSpacing()
实际上,边界矩形的高度通常是以下各项的总和:

  • height()乘以行数;
  • leading()乘以行之间的间隔数(aka:行数-1);

或者,类似地,以下各项的总和:

  • ascent();
  • lineSpacing()乘以行间距的数量;
  • descent();

请注意,很明显,行数取决于输入文本和给定的选项,例如,如果启用了自动换行,并且任何源代码行都不适合给定的源代码矩形。
最后,如果您计划使用QPainter绘制格式化文本,那么请考虑使用QTextDocument,或者至少使用QTextLayout,它与标准的Qt文本绘制一致,通常更快、更可靠且“更简单”(好吧,一旦您了解了它)。

相关问题