QFont有两种设置字体大小的方式,PointSize点大小和PixelSize像素大小。都设置为20,
font1.setPointSizeF(20);
font2.setPixelSize(20);
显示效果如图:
PointSize单位是磅,也就是 1/72 inch,PixelSize与PointSize的换算关系就是
PixelSize = DPI * PointSize / 72
Windows下,DPI固定为96,所以要让它们显示的字体大小一样时可以这样换算:
font1.setPointSizeF(20);
font2.setPixelSize(20 * 96 / 72);
字体在屏幕上的实际大小 = 字体像素大小 * 点距,设置了固定的点大小之后,字体会在不同分辨率、相同DPI的屏幕下会显示相同的大小,而在相同分辨率、不同DPI的屏幕下会随DPI设置而改变大小。仍然是20点大小的时候,屏幕设置为150%缩放时,左边PointSize设置的字体明显会变大:
字体绘制的基线是英文小写字母的书写下边缘,字号变大时也是基于这条线向上放大。
字体相关位置和尺寸可以通过QFontMetrics来计算。
int QFontMetrics::width(str);//宽度
QRect QFontMetrics::boundingRect(str);//字符串的边界
int QFontMetrics::height();//高度
int QFontMetrics::ascent();//基线以上高度
int QFontMetrics::descent();//基线以下高度
int QFontMetrics::leading();//行距
int QFontMetrics::lineSpacing();//行高
图片参考:
Qt 字体(01):文本尺寸的常见参数解释_qt在windows和linux获取的字体宽度不对-CSDN博客
其中height = ascent + descent
lineSpacing = height + leading,
这些值除width外,都与字体ttf本身有关。如同样是20号字,height, ascent, descent, leading, lineSpacing四个值分别为:
微软雅黑 35 28 7 0 35,
宋体 27 23 4 4 31,
都以同样的颜色绘制出来,左边微软雅黑,右边宋体,雅黑的leading是0所以有两条线重合了:
QFontMetrics算出的boundingRect 的高度和height一致,宽度要比width窄一些,而QPainter的boundingRect函数算出的矩形宽高是一致的:
painter.setPen(QColor(0xff, 0x00, 0x00));
auto rect = metri1.boundingRect(str1);
rect.moveTo(startP1.x(), startP1.y() - ascent);
painter.drawRect(rect);
auto rect2 = painter.boundingRect(QRect(startP2.x(), startP2.y() - ascent,width(),height()), Qt::AlignLeft | Qt::AlignTop, str2);
painter.drawRect(rect2);