实用QFontMetrics

一、描述

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

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

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

二、部分实用的成员函数

先上一张图:

图片来自:https://blog.csdn.net/hitzsf/article/details/108720460

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

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

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

2、QRect QFontMetrics::boundingRect(const QString &text) const。返回字符串所占的QRect。

3、int QFontMetrics::capHeight() const。返回大写字母的高度。

4、QString QFontMetrics::elidedText(const QString &text, Qt::TextElideMode mode, int width, int flags = 0) const。如果字符串文本宽度大于宽度,则返回该字符串的省略版本(即,其中包含“…”的字符串)。否则,返回原始字符串。宽度以像素而不是字符为单位指定。

参数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 QFontMetrics::fontDpi() const。获取字体DPI。

6、int QFontMetrics::horizontalAdvance(const QString &text, int len = -1) const。返回文本的第一个长度字符的水平进位(以像素为单位)。如果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 QFontMetrics::horizontalAdvance(QChar ch) const。同上,参数不同。

8、bool QFontMetrics::inFont(QChar ch) const。如果字符ch是字体中的有效字符,则返回true;否则返回false。

9、int QFontMetrics::lineWidth() const。返回下划线和删除线的线宽。

10、int QFontMetrics::maxWidth() const。返回字体中最宽字符的宽度。

11、QSize QFontMetrics::size(int flags, const QString &text, int tabStops = 0, int *tabArray = nullptr) const。获取文本的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 QFontMetrics::overlinePos() const。返回从基线到应绘制上划线的位置的距离。(字体不一定设置了上划线)

13、int QFontMetrics::strikeOutPos() const。返回从基线到删除线应绘制位置的距离。(字体不一定设置了删除线)

14、QRect QFontMetrics::tightBoundingRect(const QString &text) const。返回文本指定的字符串中字符周围的紧边框。(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 QFontMetrics::underlinePos() const。返回从基线到应绘制下划线的位置的距离。(字体不一定设置了下划线)

三、QFontMetrics和QFontMetricsF

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

猜你喜欢

转载自blog.csdn.net/kenfan1647/article/details/115171891