前言
Qt中文本的尺寸结构比较比较简单,比较容易掌握。和windows下字体尺寸的定义不一样。
一、怎么知道文本的宽度和高度?
不同的字体,所占的空间尺寸是不同的。需要明确当前所使用的字体。
-
定义一个QFont font,为了显示方便,特意定义了一个尺寸的字体
QFont font; font.setPixelSize(400);
-
使用 QFontMetrics 类来计算给定字体的字符和字符串的大小。
QFontMetrics fm(font);
-
重点掌握QFontMetrics 几个方法
int QFontMetrics::horizontalAdvance(str); //宽度 QRect QFontMetrics::boundingRect(str); //字符串的边界 int QFontMetrics::height(); //高度 int QFontMetrics::ascent(); //基线以上高度 int QFontMetrics::descent(); //基线以下高度 int QFontMetrics::leading(); //行距 int QFontMetrics::fm.lineSpacing(); //行高
二、文本尺寸的度量
由图可以看出:
- height = ascent + descent
- lineSpacing = height + leading
- boundingRect 的高度和height一致,但宽度有点偏窄
- 红线为baseline,文本绘制是起点位置
- leading = descent ,这一点在Qt文档里没有明确,可能是特例吧
主要部分代码如下:
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing);
QFont font;
font.setPixelSize(400);
QFontMetrics fm(font);
QString str("Agǎ8");
int w = fm.horizontalAdvance(str);
int h = fm.height();
int ascent = fm.ascent();
int descent= fm.descent();
int leading = fm.leading();
int lineSpacing = fm.lineSpacing();
qDebug() << w;
qDebug() << h << ascent << descent << leading;
qDebug() << leading;
qDebug() << descent;
qDebug() << lineSpacing;
int base = 500;
painter.setFont(font);
painter.drawText(0,base,str);
//基线 红色
painter.setPen(Qt::red);
painter.drawLine(0,base,w,base);
//高度线 绿色 height() = ascent()+descent()
painter.setPen(Qt::green);
painter.drawLine(0,base - h,w,base - h);
//上升线 青色
painter.setPen(Qt::cyan);
painter.drawLine(0,base-ascent,w,base-ascent);
//下沉线 蓝色
painter.setPen(Qt::blue);
painter.drawLine(0,base + descent,w,base + descent);
QRect rect = fm.boundingRect(str);
rect.moveTo(0,base-ascent);
painter.fillRect(rect,QColor(123,123,123,123));
}
总结
本文仅仅简单介绍了QFontMetrics 中几种对作用于字体的函数:ascent(),descent(),height(),leading()和lineSpacing()。