QFontMetrics

一、描述

QFontMetrics提供关于字体的指标信息。

QFontMetrics的函数用于计算给定字体的字符和字符串的大小。有三种方法可以创建QFontMetrics对象:

  • QFont调用QFontMetrics构造函数会为屏幕兼容字体创建QFontMetrics对象,即字体不能是打印机字体。
  • QWidget::fontMetrics()返回小部件字体的QFontMetrics。这相当于QFontMetrics(widget->font())。
  • QPainter::fontMetrics()返回painter当前字体的QFontMetrics。

二、部分实用的成员函数

先上一张图:

图片来自:Qt 字体(01):文本尺寸的常见参数解释_读书笔记-CSDN博客

height = ascent + descent

leading:行距
baseline:基线,文本绘制是起始位置

lineSpacing:两基线间的距离

lineSpacing = height + leading

boundingRect 的高度和height一致,但宽度有点偏窄

leading = descent ,这一点在Qt文档里没有明确,可能是特例吧

————————————————

版权声明:本文为CSDN博主「hitzsf」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hitzsf/article/details/108720460

1、QRect boundingRect(QChar ch)

如果要在坐标系原点绘制字符ch,则返回墨迹覆盖的矩形。注意,边界矩形可以延伸到(0,0)的左侧(例如斜体字体),并且文本输出可以覆盖边界矩形中的所有像素。对于空格字符,矩形通常为空。矩形通常延伸到基线的上方和下方。

坐标系原点: 以基线为x轴

    QFontMetrics fontMetrics = this->fontMetrics();
    qDebug()<<fontMetrics.boundingRect('A');
    qDebug()<<fontMetrics.boundingRect('g');
    qDebug()<<fontMetrics.boundingRect('8');

2、QRect boundingRect(const QString &text)

返回字符串所占的QRect。

3、int capHeight()

返回大写字母的高度。

4、QString elidedText(const QString &text, Qt::TextElideMode mode, int width, int flags = 0)

如果字符串文本宽度大于宽度,则返回该字符串的省略版本(即,其中包含“…”的字符串)。否则,返回原始字符串。宽度以像素而不是字符为单位指定。

参数2是省略号位置:

  • Qt::ElideLeft:左
  • Qt::ElideRight:右
  • Qt::ElideMiddle:中
  • Qt::ElideNone:无省略号直接输出原字符。
    QFont f;
    f.setPixelSize(30);
    f.setStretch(QFont::UltraExpanded);
    QFontMetrics FontMetric1 = QFontMetrics(f);
    qDebug()<<FontMetric1.elidedText("hello world",Qt::ElideLeft,200);
    qDebug()<<FontMetric1.elidedText("hello world",Qt::ElideRight,200);
    qDebug()<<FontMetric1.elidedText("hello world",Qt::ElideMiddle,200);
    qDebug()<<FontMetric1.elidedText("hello world",Qt::ElideNone,200);

5、qreal fontDpi()

获取字体DPI。

6、int horizontalAdvance(const QString &text, int len = -1)

返回文本的第一个长度字符的水平进位(以像素为单位)。如果len为负(默认值),则使用整个字符串。这是适合在文本之后绘制后续字符的距离。

    QFont f;
    f.setPixelSize(30);
    f.setStretch(QFont::UltraExpanded);
    QFontMetrics FontMetric1 = QFontMetrics(f);
    qDebug()<<FontMetric1.boundingRect("hello wolrd");
    qDebug()<<FontMetric1.horizontalAdvance("hello world");
    qDebug()<<FontMetric1.boundingRect('W');
    qDebug()<<FontMetric1.horizontalAdvance("hello worldW");

此例子中"hello world"这个字符串的宽度是328,此字符串后续字符距离是330,也就是下一个字符是从330开始绘制,字符'W'的宽度是30,如果"hello world"后面再绘制一个'W'则整个字符串的宽度应该是360,打印验证正是360。

7、int horizontalAdvance(QChar ch)

同上,参数不同。

8、bool inFont(QChar ch)

字符ch是否字体中的有效字符。

9、int lineWidth()

返回下划线和删除线的线宽。

10、int maxWidth()

返回字体中最宽字符的宽度。

11、QSize size(int flags, const QString &text, int tabStops = 0, int *tabArray = nullptr)

获取文本的size。

参数1有以下选项:

  • Qt::TextSingleLine:忽略换行符。
  • Qt::TextExpandTabs:用空白区域填充制表符。
  • Qt::TextShowMnemonic:将 "&x" 替换为 x 来计算,这在伙伴快捷键里常用到。
  • Qt::TextWordWrap:空格当做换行。
    qDebug()<<FontMetric1.size(Qt::TextSingleLine,"hello wolrd");
    qDebug()<<FontMetric1.size(Qt::TextWordWrap,"hello wolrd");
    qDebug()<<FontMetric1.size(Qt::TextWordWrap,"hellowolrd");

12、int overlinePos()

返回从基线到应绘制上划线的位置的距离。(字体不一定设置了上划线)

13、int strikeOutPos()

返回从基线到删除线应绘制位置的距离。(字体不一定设置了删除线)

14、QRect tightBoundingRect(const QString &text)

返回文本指定的字符串中字符周围的紧边框。(Windows系统此方法非常慢)

    QFont f;
    f.setPixelSize(30);
    f.setStretch(QFont::UltraExpanded);
    QFontMetrics FontMetric1 = QFontMetrics(f);
    qDebug()<<FontMetric1.boundingRect("hello wolrd");
    qDebug()<<FontMetric1.tightBoundingRect("hello wolrd");

 得到的QRect比boundingRect()的小。

15、int underlinePos()

返回从基线到应绘制下划线的位置的距离。(字体不一定设置了下划线)

三、QFontMetrics和QFontMetricsF

这两个类中的API是一致的,只不过QFontMetricsF中的方法是qreal类型的,QFontMetrics中的方法是int类型的。

  • 27
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值