本页内容

QFontMetricsF Class

QFontMetricsF 类提供了字体度量信息。更多内容...

头文件: #include <QFontMetricsF>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui

注意:该类中的所有函数均为可重入函数。

公共函数

QFontMetricsF(const QFont &font)
QFontMetricsF(const QFontMetrics &fontMetrics)
QFontMetricsF(const QFont &font, const QPaintDevice *paintdevice)
QFontMetricsF(const QFontMetricsF &fm)
QFontMetricsF(QFontMetricsF &&)
~QFontMetricsF()
qreal ascent() const
qreal averageCharWidth() const
QRectF boundingRect(QChar ch) const
QRectF boundingRect(const QString &text) const
(since 6.3) QRectF boundingRect(const QString &text, const QTextOption &option) const
QRectF boundingRect(const QRectF &rect, int flags, const QString &text, int tabStops = 0, int *tabArray = nullptr) const
qreal capHeight() const
qreal descent() const
QString elidedText(const QString &text, Qt::TextElideMode mode, qreal width, int flags = 0) const
qreal fontDpi() const
qreal height() const
(since 6.3) qreal horizontalAdvance(const QString &text, const QTextOption &option) const
qreal horizontalAdvance(const QString &text, int length = -1) const
qreal horizontalAdvance(QChar ch) const
bool inFont(QChar ch) const
bool inFontUcs4(uint ch) const
qreal leading() const
qreal leftBearing(QChar ch) const
qreal lineSpacing() const
qreal lineWidth() const
qreal maxWidth() const
qreal minLeftBearing() const
qreal minRightBearing() const
qreal overlinePos() const
qreal rightBearing(QChar ch) const
QSizeF size(int flags, const QString &text, int tabStops = 0, int *tabArray = nullptr) const
qreal strikeOutPos() const
void swap(QFontMetricsF &other)
QRectF tightBoundingRect(const QString &text) const
(since 6.3) QRectF tightBoundingRect(const QString &text, const QTextOption &option) const
qreal underlinePos() const
qreal xHeight() const
bool operator!=(const QFontMetricsF &other) const
QFontMetricsF &operator=(QFontMetricsF &&other)
QFontMetricsF &operator=(const QFontMetrics &other)
QFontMetricsF &operator=(const QFontMetricsF &fm)
bool operator==(const QFontMetricsF &other) const

详细说明

QFontMetricsF 函数用于计算给定字体的字符和字符串的大小。您可以使用现有的QFont 来构建一个 QFontMetricsF 对象,以获取该字体的度量数据。如果随后更改了字体,字体度量对象不会更新。

对象创建后,将提供函数来访问字体、其字符以及使用该字体渲染的字符串的各个度量数据。

有几个针对字体的函数:ascent()、descent()、height()、leading() 和lineSpacing() 返回字体的基本尺寸属性。underlinePos()、overlinePos()、strikeOutPos() 和lineWidth() 函数则返回对字符进行下划线、上划线或删除线的属性。这些函数运行速度均很快。

此外,还有一些针对字体中字形集合进行操作的函数:minLeftBearing()、minRightBearing() 和maxWidth()。这些函数必然速度较慢,我们建议尽可能避免使用它们。

对于每个字符,您可以获取其horizontalAdvance()、leftBearing() 和rightBearing() 值,并通过inFont() 判断该字符是否存在于字体中。您还可以将字符视为字符串,并对其应用字符串函数。

这些字符串函数包括:horizontalAdvance()(返回字符串的宽度,单位为像素;对于打印机,则为点),boundingRect()(返回一个足以容纳渲染后字符串的矩形),以及size()(返回该矩形的大小)。

QFontMetrics 提供了两个用于计算字符串边界的不同函数,每个函数都有多个重载:boundingRect() 和tightBoundingRect()。如果需要精确的边界矩形,则应优先使用tightBoundingRect()。该函数会单独测量每个字形,从而返回一个紧密贴合渲染文本的边界矩形。 根据平台的不同,boundingRect() 函数可能会返回近似边界,但计算量较小。

示例:

QFont font("times", 24);
QFontMetricsF fm(font);
qreal pixelsWide = fm.horizontalAdvance("What's the advance width of this text?");
qreal pixelsHigh = fm.height();

另请参阅 QFont 、QFontInfo 以及QFontDatabase 。

成员函数文档

[explicit] QFontMetricsF::QFontMetricsF(const QFont &font)

为font 构建一个字体度量对象。

该字体度量将与用于创建font 的绘图设备兼容。

该字体度量对象保存着在创建时通过构造函数传入的字体信息,如果后续更改了字体的属性,该对象不会更新。

使用 QFontMetricsF(constQFont &,QPaintDevice *) 获取与特定绘图设备兼容的字体度量。

QFontMetricsF::QFontMetricsF(const QFontMetrics &fontMetrics)

根据给定的fontMetrics 对象,构建一个具有浮点精度的字体度量对象。

QFontMetricsF::QFontMetricsF(const QFont &font, const QPaintDevice *paintdevice)

为font 和paintdevice 构建一个字体度量对象。

字体度量将与传入的绘图设备兼容。如果paintdevice 是nullptr ,则度量将与屏幕兼容,即当您使用该字体在widgets 或pixmaps 上绘制文本时获得的度量,而非在QPicture 或QPrinter 上绘制文本时获得的度量。

字体度量对象保存的是该字体在构造函数中被创建时传入的信息,如果后续更改了字体的属性,该对象将不会更新。

QFontMetricsF::QFontMetricsF(const QFontMetricsF &fm)

创建fm 的副本。

[constexpr noexcept default] QFontMetricsF::QFontMetricsF(QFontMetricsF &&)

通过 Move 构造一个 `QFontMetricsF` 实例。

[noexcept] QFontMetricsF::~QFontMetricsF()

销毁字体度量对象,并释放所有已分配的资源。

qreal QFontMetricsF::ascent() const

返回字体的升高。

字体的升高是指从基线到字符延伸至最高位置的距离。实际上,有些字体设计师会打破这一规则,例如在字符上方添加多个重音符号,或为了适应特定字符,因此该值可能过小(尽管这种情况很少见)。

另请参阅 descent()。

qreal QFontMetricsF::averageCharWidth() const

返回该字体中字形的平均宽度。

QRectF QFontMetricsF::boundingRect(QChar ch) const

返回字符ch 相对于基线最左端的包围矩形。

请注意,边界矩形可能会延伸到 (0, 0) 的左侧(例如在斜体字体中),且文本输出可能会覆盖边界矩形内的所有像素。

请注意,该矩形通常会延伸至基线上下两侧。

另请参阅 horizontalAdvance()。

QRectF QFontMetricsF::boundingRect(const QString &text) const

返回由text 指定的字符串中字符的边界矩形。该边界矩形始终至少覆盖文本在坐标(0, 0)处绘制时所占据的像素集合。

请注意,边界矩形可能会延伸到 (0, 0) 的左侧(例如对于斜体字体),且返回的矩形宽度可能与horizontalAdvance() 方法返回的值不同。

如果您想知道字符串的进距(以便将一组字符串并排布局),请改用horizontalAdvance()。

换行符被视为普通字符,而非换行符。

边界矩形的高度至少与height() 返回的值一样大。

另请参阅 horizontalAdvance()、height() 和QPainter::boundingRect()。

[since 6.3] QRectF QFontMetricsF::boundingRect(const QString &text, const QTextOption &option) const

返回使用 `option` 布局的、由 `text ` 指定的字符串中字符的边界矩形。该边界矩形始终至少覆盖文本若绘制在 (0, 0) 位置时所占的像素区域。

请注意,边界矩形可能会延伸到 (0, 0) 的左侧(例如,对于斜体字体),并且返回的矩形宽度可能与horizontalAdvance() 方法返回的值不同。

如果您想知道字符串的进距(以便将一组字符串并排布局),请改用horizontalAdvance() 方法。

换行符被视为普通字符,而不是换行符。

边界矩形的高度至少与height() 返回的值一样大。

该函数在 Qt 6.3 中引入。

另请参阅 horizontalAdvance()、height() 和QPainter::boundingRect()。

QRectF QFontMetricsF::boundingRect(const QRectF &rect, int flags, const QString &text, int tabStops = 0, int *tabArray = nullptr) const

返回给定text 中字符的边界矩形。这是文本在受限于rect 指定的边界矩形内绘制时所覆盖的像素集合。如果rect 是nullptr 对象的引用(例如,当传递默认构造的QRectF 时),则边界矩形不会受该对象大小的限制。

flags 参数是以下标志的按位或运算结果:

Qt::Horizontal 对齐方式默认为Qt::AlignLeft ,垂直对齐默认为Qt::AlignTop 。

如果同时设置了多个水平对齐标志或多个垂直对齐标志,则最终的对齐方式未定义。

这些标志在Qt::AlignmentFlag 中定义。

如果Qt::TextExpandTabs 在flags 中被设置,则采用以下行为来解释文本中的制表符:

  • 如果tabArray 不为空,则它指定了文本中制表符的以0结尾的像素位置序列。
  • 如果 `tabStops ` 不为空,则将其用作制表符间距(以像素为单位)。

请注意,边界矩形可能会延伸至 (0, 0) 左侧,例如在斜体字体中。

换行符将被处理为换行。

尽管实际字符高度不同,但“Yes”和“yes”的边界矩形高度是相同的。

此函数返回的边界矩形比由更简单的 boundingRect() 函数计算出的稍大一些。此函数使用maximum left 和right 字体间距,这是多行文本正确对齐所必需的。此外,它使用 fontHeight() 和lineSpacing() 来计算高度,而不是单个字符的高度。

这是一个重载函数。

另请参阅 horizontalAdvance()、QPainter::boundingRect() 以及Qt::Alignment 。

qreal QFontMetricsF::capHeight() const

返回字体的字母高度。

字体的字高是指大写字母高于基线的高度。具体而言,它指的是扁平的大写字母(如 H 或 I)的高度,而非圆形的字母(如 O)或尖头的字母(如 A),后两类字母在显示时可能会出现超出基线的情况。

另请参阅 ascent()。

qreal QFontMetricsF::descent() const

返回字体的下伸高度。

下伸量是指从基线到字符延伸到的最低点的距离。(请注意,这与 X 不同,X 会增加 1 像素。)实际上,有些字体设计师会打破这一规则,例如为了适应某个特定字符,因此该值可能(尽管很少见)过小。

另请参阅 ascent()。

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

如果字符串text 的宽度大于width ,则返回该字符串的截断版本(即包含“...”的字符串)。否则,返回原始字符串。

mode 参数指定文本是在左侧(例如“...tech”)、中间(例如“Tr...ch”)还是右侧(例如“Trol...”)进行截断。

width 以像素为单位,而非字符。

flags 参数是可选的,目前仅支持Qt::TextShowMnemonic 作为值。

省略标记位于layoutdirection 之后。例如,如果mode 为Qt::ElideLeft ,则在从右到左的布局中,省略标记将位于文本的右侧;如果mode 为Qt::ElideRight ,则位于文本的左侧。

qreal QFontMetricsF::fontDpi() const

返回字体的 DPI 值。

qreal QFontMetricsF::height() const

返回字体的高度。

该值始终等于ascent() +descent()。

另请参阅 leading() 和lineSpacing()。

[since 6.3] qreal QFontMetricsF::horizontalAdvance(const QString &text, const QTextOption &option) const

返回使用 `option` 布局的 `text ` 的水平间距(以像素为单位)。

该间距是text 之后绘制下一个字符所需的适当距离。

该函数于 Qt 6.3 中引入。

另请参阅 boundingRect()。

qreal QFontMetricsF::horizontalAdvance(const QString &text, int length = -1) const

返回text 中前length 个字符的水平间距(以像素为单位)。如果length 为负数(默认值),则使用整个字符串。即使length 明显较短,也会分析text 的整个长度。

进位距离是指在text 之后绘制下一个字符所需的距离。

另请参阅 boundingRect()。

qreal QFontMetricsF::horizontalAdvance(QChar ch) const

轴承

返回字符ch 的水平间距(以像素为单位)。这是在调用ch 后绘制后续字符时应保留的距离。

右侧图片中描述了部分度量参数。中央的深色矩形覆盖了每个字符的逻辑 horizontalAdvance() 值。外侧的浅色矩形则覆盖了每个字符的leftBearing() 和rightBearing() 值。 请注意,在此特定字体中,“f”的两个偏移量均为负值,而“o”的两个偏移量均为正值。

警告: 对于字符串中间的阿拉伯字符或非间隔符号,此 函数将产生不正确的结果,因为无法考虑处理字符串时发生的字形塑造和符号定位情况。在实现交互式文本控件时,请改用QTextLayout 。

这是一个重载函数。

另请参阅 boundingRect()。

bool QFontMetricsF::inFont(QChar ch) const

如果字符ch 是该字体中的有效字符,则返回true ;否则返回false 。

bool QFontMetricsF::inFontUcs4(uint ch) const

如果由ch 指定的字符(采用UCS-4/UTF-32编码)是该字体中的有效字符,则返回true ;否则返回false 。

qreal QFontMetricsF::leading() const

返回字体的行首间距。

这是自然的行间距。

另请参阅 height() 和lineSpacing()。

qreal QFontMetricsF::leftBearing(QChar ch) const

返回字体中字符ch 的左方位角。

左偏移量是指字符最左侧像素到该字符逻辑原点的向右距离。如果字符的像素延伸到逻辑原点的左侧,则该值为负数。

有关此度量的图形说明,请参阅horizontalAdvance()。

另请参阅 rightBearing()、minLeftBearing() 和horizontalAdvance()。

qreal QFontMetricsF::lineSpacing() const

返回从一条基线到下一条基线的距离。

该值始终等于leading() +height()。

另请参阅 height() 和leading()。

qreal QFontMetricsF::lineWidth() const

返回下划线和删除线的宽度,该宽度已根据字体的点大小进行调整。

另请参阅 underlinePos()、overlinePos() 和strikeOutPos()。

qreal QFontMetricsF::maxWidth() const

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

qreal QFontMetricsF::minLeftBearing() const

返回该字体的最小左偏角。

这是字体中所有字符的最小leftBearing (字符)。

请注意,如果字体较大,此函数的执行速度可能会非常慢。

另请参阅 minRightBearing() 和leftBearing()。

qreal QFontMetricsF::minRightBearing() const

返回该字体的最小右偏角。

这是字体中所有字符的最小rightBearing (字符)。

请注意,如果字体较大,此函数的执行速度可能会非常慢。

另请参阅 minLeftBearing() 和rightBearing()。

qreal QFontMetricsF::overlinePos() const

返回从基线到应绘制上划线位置的距离。

另请参阅 underlinePos()、strikeOutPos(),以及lineWidth()。

qreal QFontMetricsF::rightBearing(QChar ch) const

返回字体中字符ch 的右偏移量。

右偏移量是指字符最右侧像素到后续字符逻辑原点的向左距离。如果该字符的像素延伸到了horizontalAdvance() 所指位置的右侧,则该值为负数。

有关此度量的图形说明,请参阅horizontalAdvance()。

另请参阅 leftBearing()、minRightBearing() 和horizontalAdvance()。

QSizeF QFontMetricsF::size(int flags, const QString &text, int tabStops = 0, int *tabArray = nullptr) const

返回给定text 中字符的像素大小。

flags 参数是以下标志的按位或运算结果:

这些标志在Qt::TextFlag 枚举中定义。

如果在flags 中设置了Qt::TextExpandTabs ,则采用以下行为来解释文本中的制表符:

  • 如果tabArray 不为空,则它指定了文本中制表符的以0结尾的像素位置序列。
  • 如果 `tabStops ` 不为空,则将其用作制表符的间距(以像素为单位)。

换行符将被处理为换行。

注意:尽管实际字符高度不同,但“Yes”和“yes”的边界矩形高度是相同的。

另请参阅 boundingRect()。

qreal QFontMetricsF::strikeOutPos() const

返回从基线到应绘制出局线位置的距离。

另请参阅 underlinePos()、overlinePos() 和lineWidth()。

[noexcept] void QFontMetricsF::swap(QFontMetricsF &other)

将此字体度量实例替换为other 。此操作速度极快,且绝不会失败。

QRectF QFontMetricsF::tightBoundingRect(const QString &text) const

返回一个紧包text 指定的字符串中所有字符的边界矩形。该边界矩形始终至少覆盖文本若绘制在(0, 0)处所占的像素区域。

请注意,边界矩形可能会延伸到 (0, 0) 的左侧(例如对于斜体字体),且返回的矩形宽度可能与horizontalAdvance() 方法返回的值不同。

如果您想知道字符串的进距(以便将一组字符串并排布局),请改用horizontalAdvance()。

换行符被视为普通字符,而非换行符。

另请参阅 horizontalAdvance()、height() 和boundingRect()。

[since 6.3] QRectF QFontMetricsF::tightBoundingRect(const QString &text, const QTextOption &option) const

返回一个紧包矩形,该矩形包围了由text 指定的字符串中、使用option 布局的字符。该紧包矩形始终至少覆盖文本若绘制在(0,0)位置时所占的像素区域。

请注意,边界矩形可能会延伸到 (0, 0) 的左侧(例如对于斜体字体),且返回的矩形宽度可能与horizontalAdvance() 方法返回的值不同。

如果您想知道字符串的进距(以便将一组字符串并排布局),请改用horizontalAdvance() 方法。

换行符被视为普通字符处理,而非换行符。

此函数在 Qt 6.3 中引入。

另请参阅 horizontalAdvance()、height() 和boundingRect()。

qreal QFontMetricsF::underlinePos() const

返回从基线到应绘制下划线位置的距离。

另请参阅 overlinePos()、strikeOutPos() 和lineWidth()。

qreal QFontMetricsF::xHeight() const

返回字体的“x”高度。这通常(但并非总是)与字符“x”的高度相同。

bool QFontMetricsF::operator!=(const QFontMetricsF &other) const

如果字体度量值不等于other 的字体度量值,则返回true ;否则返回false 。

另请参阅 operator==()。

[noexcept] QFontMetricsF &QFontMetricsF::operator=(QFontMetricsF &&other)

将other 通过移动赋值操作赋值给此QFontMetricsF 实例。

QFontMetricsF &QFontMetricsF::operator=(const QFontMetrics &other)

将other 分配给此对象。

QFontMetricsF &QFontMetricsF::operator=(const QFontMetricsF &fm)

将字体度量数据fm 分配给此字体度量对象。

bool QFontMetricsF::operator==(const QFontMetricsF &other) const

如果字体度量与other 字体度量相等,则返回true ;否则返回false 。

如果两个字体度量是基于同一个QFont 构建的,且它们所针对的绘制设备被视为兼容,则认为这两个字体度量相等。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.