我试图用PySide6的QPainter
和QFontMetrics
绘制多个文本段落。我想用与在一个文本块中绘制时相同的间距来绘制它们,但是行距不太正确。
在下面的示例中,字体规格说明字体的行距为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
顺便说一句,并不总是一个额外的像素。如果我把字体变大,额外的空间也会增加。
1条答案
按热度按时间1yjd4xko1#
首先,字体度量的边框高度并不取决于所使用的字符,而是取决于字体规范。
两行文本没有一行边框的
height()
的两倍:相反,您必须考虑lineSpacing()
。实际上,边界矩形的高度通常是以下各项的总和:
height()
乘以行数;leading()
乘以行之间的间隔数(aka:行数-1);或者,类似地,以下各项的总和:
ascent()
;lineSpacing()
乘以行间距的数量;descent()
;请注意,很明显,行数取决于输入文本和给定的选项,例如,如果启用了自动换行,并且任何源代码行都不适合给定的源代码矩形。
最后,如果您计划使用QPainter绘制格式化文本,那么请考虑使用QTextDocument,或者至少使用QTextLayout,它与标准的Qt文本绘制一致,通常更快、更可靠且“更简单”(好吧,一旦您了解了它)。