QFontMetrics Class
QFontMetrics 类提供字体度量信息。更多
Header: | #include <QFontMetrics> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake: | QT += gui |
- 所有成员(包括继承成员)的列表
- QFontMetrics 属于绘制类和隐式共享类。
注意:该类中的所有函数都是可重入的。
公共函数
QFontMetrics(const QFont &font) | |
QFontMetrics(const QFont &font, const QPaintDevice *paintdevice) | |
QFontMetrics(const QFontMetrics &fm) | |
~QFontMetrics() | |
int | ascent() const |
int | averageCharWidth() const |
QRect | boundingRect(QChar ch) const |
QRect | boundingRect(const QString &text) const |
(since 6.3) QRect | boundingRect(const QString &text, const QTextOption &option) const |
QRect | boundingRect(const QRect &rect, int flags, const QString &text, int tabStops = 0, int *tabArray = nullptr) const |
QRect | boundingRect(int x, int y, int width, int height, int flags, const QString &text, int tabStops = 0, int *tabArray = nullptr) const |
int | capHeight() const |
int | descent() const |
QString | elidedText(const QString &text, Qt::TextElideMode mode, int width, int flags = 0) const |
qreal | fontDpi() const |
int | height() const |
(since 6.3) int | horizontalAdvance(const QString &text, const QTextOption &option) const |
int | horizontalAdvance(const QString &text, int len = -1) const |
int | horizontalAdvance(QChar ch) const |
bool | inFont(QChar ch) const |
bool | inFontUcs4(uint ucs4) const |
int | leading() const |
int | leftBearing(QChar ch) const |
int | lineSpacing() const |
int | lineWidth() const |
int | maxWidth() const |
int | minLeftBearing() const |
int | minRightBearing() const |
int | overlinePos() const |
int | rightBearing(QChar ch) const |
QSize | size(int flags, const QString &text, int tabStops = 0, int *tabArray = nullptr) const |
int | strikeOutPos() const |
void | swap(QFontMetrics &other) |
QRect | tightBoundingRect(const QString &text) const |
(since 6.3) QRect | tightBoundingRect(const QString &text, const QTextOption &option) const |
int | underlinePos() const |
int | xHeight() const |
bool | operator!=(const QFontMetrics &other) const |
QFontMetrics & | operator=(QFontMetrics &&other) |
QFontMetrics & | operator=(const QFontMetrics &fm) |
bool | operator==(const QFontMetrics &other) const |
详细说明
QFontMetrics 函数计算给定字体的字符和字符串的大小。该类是基于整数的QFontMetricsF 版本,会将所有数字四舍五入为最接近的整数。这意味着对于任何小数度量的字体,其结果都将是不准确的。在大多数情况下,QFontMetricsF 。
创建 QFontMetrics 对象有三种方法:
- 使用QFont 调用 QFontMetrics 构造函数,为屏幕兼容字体创建字体度量对象,即字体不能是打印机字体。如果以后更改字体,则不会更新字体度量对象。
(注意:如果使用打印机字体,返回的值可能不准确。打印机字体并不总是可以访问的,因此如果提供的是打印机字体,则会使用最近的屏幕字体)。
- QWidget::fontMetrics() 返回 widget 字体的字体度量值。这等同于 QFontMetrics(widget->font())。如果以后更改了 widget 的字体,则不会更新字体度量对象。
- QPainter::fontMetricsQFontMetrics(widget->font() 返回画家当前字体的字体度量值。如果以后更改了绘画者的字体,则不会更新字体度量对象。
创建字体度量对象后,该对象提供的函数可用于访问字体、字体字符和以字体渲染的字符串的各个度量值。
有几个函数可对字体进行操作:ascent(),descent(),height(),leading() 和lineSpacing() 返回字体的基本尺寸属性。underlinePos(),overlinePos(),strikeOutPos() 和lineWidth() 函数返回下划线、上划线或删除字符行的属性。这些函数的速度都很快。
还有一些函数对字体中的字形集进行操作:minLeftBearing(),minRightBearing() 和maxWidth() 。这些函数的速度必然较慢,建议尽量避免使用。
对于每个字符,您可以获取其horizontalAdvance()、leftBearing() 和rightBearing(),并使用inFont() 查看它是否在字体中。您还可以将字符视为字符串,并对其使用字符串函数。
字符串函数包括horizontalAdvance() (以像素为单位返回字符串的前进宽度(打印机则以点为单位))、boundingRect() (返回一个足够大的矩形,以包含渲染的字符串)和size() (返回该矩形的大小)。
注意: 前进宽度可能与实际渲染文本的宽度不同。它指的是从字符串原点到附加字符位置的距离。由于文本可能有悬空(例如斜体)或字符之间有填充,因此预置宽度可能比实际呈现的文本宽度小或大。这就是所谓的文本右方位。
举例说明:
QFont font("times", 24); QFontMetrics fm(font); int pixelsWide = fm.horizontalAdvance("What's the advance width of this text?"); int pixelsHigh = fm.height();
另请参阅 QFont,QFontInfo, 和QFontDatabase 。
成员函数文档
[explicit]
QFontMetrics::QFontMetrics(const QFont &font)
为font 构建字体度量对象。
字体度量标准将与用于创建font 的 paintdevice 兼容。
字体度量对象保存创建时在构造函数中传递的字体信息,如果字体的属性在以后发生变化,该对象将不会更新。
使用 QFontMetrics(constQFont &,QPaintDevice *) 可获取与特定绘画设备兼容的字体度量值。
QFontMetrics::QFontMetrics(const QFont &font, const QPaintDevice *paintdevice)
为font 和paintdevice 构建字体度量对象。
字体指标将与所传递的 paintdevice 兼容。如果paintdevice 是nullptr
,指标将与屏幕兼容,即在widgets 或pixmaps 上使用该字体绘制文本时得到的指标,而不是在QPicture 或QPrinter 上得到的指标。
字体度量值对象保存的是创建时在构造函数中传递的字体信息,如果字体的属性在以后发生变化,这些信息将不会更新。
QFontMetrics::QFontMetrics(const QFontMetrics &fm)
构造fm 的副本。
[noexcept]
QFontMetrics::~QFontMetrics()
销毁字体度量对象并释放所有已分配的资源。
int QFontMetrics::ascent() const
返回字体的坡度。
字体的坡度是从基线到字符最高位置的距离。在实践中,一些字体设计者会打破这一规则,例如在一个字符的顶部添加多个重音,或为了适应某个字符,因此这个值有可能太小(虽然很少见)。
另请参见 descent()。
int QFontMetrics::averageCharWidth() const
返回字体中字形的平均宽度。
QRect QFontMetrics::boundingRect(QChar ch) const
返回在坐标系原点绘制字符ch 时墨水覆盖的矩形。
请注意,边界矩形可能会扩展到(0,0)的左侧(例如斜体字体),而且文本输出可能会覆盖边界矩形中的所有像素。对于空格字符,矩形通常为空。
请注意,矩形通常会在基线上下延伸。
警告 返回的矩形宽度不是字符的前进宽度。请使用 boundingRect(constQString &) 或horizontalAdvance() 代替。
另请参阅 horizontalAdvance()。
QRect QFontMetrics::boundingRect(const QString &text) const
返回text 所指定字符串中字符的边界矩形。边界矩形总是至少覆盖文本在 (0, 0) 处绘制时所覆盖的像素集。
请注意,边界矩形可能会扩展到(0,0)的左侧,例如斜体字体,而且返回的矩形宽度可能与horizontalAdvance() 方法返回的宽度不同。
如果您想知道字符串的预宽度(以便将一组字符串排列在一起),请使用horizontalAdvance() 代替。
换行符将作为普通字符而非换行符处理。
边界矩形的高度至少与height() 返回的值一样大。
另请参阅 horizontalAdvance()、height()、QPainter::boundingRect() 和tightBoundingRect()。
[since 6.3]
QRect QFontMetrics::boundingRect(const QString &text, const QTextOption &option) const
返回text 所指定字符串中字符的边界矩形,该矩形使用option 布局。边界矩形总是至少覆盖文本在 (0, 0) 处绘制时所覆盖的像素集。
请注意,边界矩形可能会扩展到 (0, 0) 的左侧,例如斜体字体,而且返回的矩形宽度可能与horizontalAdvance() 方法返回的宽度不同。
如果您想知道字符串的预宽度(以便将一组字符串排列在一起),请使用horizontalAdvance() 代替。
换行符将作为普通字符而非换行符处理。
边界矩形的高度至少与height() 返回的值一样大。
此函数在 Qt 6.3 中引入。
另请参阅 horizontalAdvance()、height()、QPainter::boundingRect() 和tightBoundingRect()。
QRect QFontMetrics::boundingRect(const QRect &rect, int flags, const QString &text, int tabStops = 0, int *tabArray = nullptr) const
这是一个重载函数。
返回text 所指定字符串中字符的边界矩形,即文本在 (0, 0) 处绘制时所覆盖的像素集合。绘制和边界矩形都受限于矩形rect 。
flags 参数是以下标志的位向 OR:
- Qt::AlignLeft 与左边界对齐,阿拉伯语和希伯来语除外,与右边界对齐。
- Qt::AlignRight 按右边框对齐,阿拉伯语和希伯来语除外,这两种语言按左边框对齐。
- Qt::AlignJustify 生成对齐文本。
- Qt::AlignHCenter 水平居中对齐。
- Qt::AlignTop 与上边框对齐。
- Qt::AlignBottom 与下边框对齐。
- Qt::AlignVCenter 垂直居中对齐
- Qt::AlignCenter (== )
Qt::AlignHCenter | Qt::AlignVCenter
- Qt::TextSingleLine 忽略文本中的换行符。
- Qt::TextExpandTabs 展开制表符(见下文)
- Qt::TextShowMnemonic 将"&x "解释为x,即下划线。
- Qt::TextWordWrap 分割文本以适应矩形。
Qt::Horizontal 对齐方式默认为 ,垂直对齐方式默认为 。Qt::AlignLeft Qt::AlignTop
如果设置了多个水平对齐标志或多个垂直对齐标志,则产生的对齐方式是未定义的。
如果Qt::TextExpandTabs 在flags 中被设置,那么:如果tabArray 非空,它将为制表符指定一个以 0 结尾的像素位置序列;否则,如果tabStops 非零,它将用作制表符间距(以像素为单位)。
请注意,边界矩形可能会扩展到(0,0)的左边,例如斜体字体,而且文本输出可能会覆盖边界矩形中的所有像素。
换行符将作为换行符处理。
尽管实际字符高度不同,但 "Yes "和 "yes "的边界矩形高度是一样的。
该函数返回的边界矩形比更简单的 boundingRect() 函数计算的边界矩形要大一些。该函数使用maximum left 和right 字体方位,这是多行文本正确对齐所必需的。此外,fontHeight() 和lineSpacing() 用于计算高度,而不是单个字符的高度。
另请参见 horizontalAdvance()、QPainter::boundingRect() 和Qt::Alignment 。
QRect QFontMetrics::boundingRect(int x, int y, int width, int height, int flags, const QString &text, int tabStops = 0, int *tabArray = nullptr) const
这是一个重载函数。
返回text 在x 和y 坐标、width 和height 指定的矩形内的边界矩形。
如果Qt::TextExpandTabs 在flags 中设置,且tabArray 非空,它将指定以 0 为结尾的制表符像素位置序列;否则,如果tabStops 非零,它将用作制表符间距(以像素为单位)。
int QFontMetrics::capHeight() const
返回字体的上限高度。
字体的上限高度是大写字母高于基线的高度。特别是扁平大写字母(如 H 或 I)的上限高度,而不是圆形字母(如 O)或尖形字母(如 A)的上限高度,这两种字母都可能显示超调。
另请参见 ascent()。
int QFontMetrics::descent() const
返回字体的下降值。
下降值是从基线到字符延伸到的最低点的距离。在实践中,一些字体设计者会打破这一规则,例如,为了适应某个字符,所以这个值有可能太小(虽然很少见)。
另请参见 ascent()。
QString QFontMetrics::elidedText(const QString &text, Qt::TextElideMode mode, int width, int flags = 0) const
如果字符串text 的宽度大于width ,则返回该字符串的省略版本(即包含"... "的字符串)。否则,将返回原始字符串。
mode 参数指定文本是在左边(如"...tech")、中间(如 "Tr...ch")还是右边(如 "Trol...")被省略。
width 的指定单位是像素,而不是字符。
flags 参数是可选的,目前只支持Qt::TextShowMnemonic 作为值。
消除标记跟随layoutdirection 。例如,如果mode 是Qt::ElideLeft
,它将位于从右到左布局的文本右侧;如果mode 是Qt::ElideRight
,它将位于文本左侧。
qreal QFontMetrics::fontDpi() const
返回字体 DPI。
int QFontMetrics::height() const
返回字体的高度。
另请参阅 leading() 和lineSpacing()。
[since 6.3]
int QFontMetrics::horizontalAdvance(const QString &text, const QTextOption &option) const
使用option 返回text 布局的水平提前量(以像素为单位)。
提前量是在text 之后绘制后续字符的适当距离。
此函数在 Qt 6.3 中引入。
另请参阅 boundingRect()。
int QFontMetrics::horizontalAdvance(const QString &text, int len = -1) const
以像素为单位返回text 第一个len 字符的水平前进值。如果len 为负数(默认值),则使用整个字符串。即使len 短得多,也会分析text 的整个长度。
这是在text 之后绘制后续字符的适当距离。
另请参见 boundingRect()。
int QFontMetrics::horizontalAdvance(QChar ch) const
这是一个重载函数。
返回ch 字符的水平前进距离,单位为像素。这是一个适合在ch 之后绘制后续字符的距离。
图像中描述了一些指标。中央的深色矩形覆盖了每个字符的逻辑水平前进()距离。外部的浅色矩形覆盖了每个字符的leftBearing() 和rightBearing() 。请注意,在这种特殊字体中,"f "的方位都是负的,而 "o "的方位都是正的。
警告: 对于阿拉伯字符或字符串中间的非间距标记,该函数将产生不正确的结果,因为无法考虑处理字符串时发生的字形整形和标记定位。在执行交互式文本控制时,请使用QTextLayout 。
另请参见 boundingRect().
bool QFontMetrics::inFont(QChar ch) const
如果字符ch 是字体中的有效字符,则返回true
;否则返回false
。
bool QFontMetrics::inFontUcs4(uint ucs4) const
如果以 UCS-4/UTF-32 编码的字符ucs4 是字体中的有效字符,则返回true
;否则返回false
。
int QFontMetrics::leading() const
返回字体的前导值。
这是自然行间距。
另请参阅 height() 和lineSpacing()。
int QFontMetrics::leftBearing(QChar ch) const
返回字体中字符ch 的左方位。
左方位是字符最左端像素与字符逻辑原点的向右距离。如果字符的像素向逻辑原点的左边延伸,则该值为负。
有关该指标的图形描述,请参见horizontalAdvance() 。
另请参见 rightBearing()、minLeftBearing() 和horizontalAdvance()。
int QFontMetrics::lineSpacing() const
返回从一条基线到下一条基线的距离。
int QFontMetrics::lineWidth() const
返回下划线和删除线的宽度,并根据字体的点大小进行调整。
另请参阅 underlinePos()、overlinePos() 和strikeOutPos()。
int QFontMetrics::maxWidth() const
返回字体中最宽字符的宽度。
int QFontMetrics::minLeftBearing() const
返回字体的最小左方位。
这是字体中所有字符的最小leftBearing(char)。
请注意,如果字体较大,此函数的运行速度会很慢。
另请参阅 minRightBearing() 和leftBearing()。
int QFontMetrics::minRightBearing() const
返回字体的最小右方位。
这是字体中所有字符的最小rightBearing(char)。
请注意,如果字体较大,此函数的运行速度会很慢。
另请参阅 minLeftBearing() 和rightBearing()。
int QFontMetrics::overlinePos() const
返回从基准线到应绘制的过度线的距离。
另请参阅 underlinePos()、strikeOutPos() 和lineWidth()。
int QFontMetrics::rightBearing(QChar ch) const
返回字符ch 在字体中的右方位。
右方位是字符最右边的像素到后续字符逻辑原点的向左距离。如果字符的像素延伸到horizontalAdvance() 的右侧,则该值为负数。
有关此指标的图形描述,请参见horizontalAdvance() 。
另请参阅 leftBearing()、minRightBearing() 和horizontalAdvance()。
QSize QFontMetrics::size(int flags, const QString &text, int tabStops = 0, int *tabArray = nullptr) const
返回text 的大小(像素)。
flags 参数是下列标志的位向 OR:
- Qt::TextSingleLine 忽略换行符。
- Qt::TextExpandTabs 扩展制表符(见下文)
- Qt::TextShowMnemonic 将"&x "解释为x,即下划线。
- Qt::TextWordWrap 断开文本以适应矩形。
如果Qt::TextExpandTabs 在flags 中被设置,那么:如果tabArray 非空,它将为制表符指定一个以 0 结尾的像素位置序列;否则,如果tabStops 非零,它将用作制表符间距(以像素为单位)。
换行符将作为换行符处理。
尽管实际字符高度不同,但 "Yes "和 "yes "的边界矩形高度是相同的。
另请参阅 boundingRect()。
int QFontMetrics::strikeOutPos() const
返回从底线到三振出局线的距离。
另请参阅 underlinePos()、overlinePos() 和lineWidth()。
[noexcept]
void QFontMetrics::swap(QFontMetrics &other)
将此字体度量实例与other 互换。该操作速度非常快,从未出现过故障。
QRect QFontMetrics::tightBoundingRect(const QString &text) const
返回text 所指定字符串周围的紧包围矩形。边界矩形总是至少覆盖文本在 (0, 0) 处绘制时所覆盖的像素集。
请注意,边界矩形可能会扩展到(0,0)的左侧,例如斜体字体,而且返回的矩形宽度可能与horizontalAdvance() 方法返回的宽度不同。
如果您想知道字符串的预宽度(以便将一组字符串排列在一起),请使用horizontalAdvance() 代替。
换行符将作为普通字符而非换行符处理。
另请参阅 horizontalAdvance()、height() 和boundingRect()。
[since 6.3]
QRect QFontMetrics::tightBoundingRect(const QString &text, const QTextOption &option) const
返回text 所指定字符串周围的紧边矩形,该矩形使用option 布局。边界矩形总是至少覆盖文本在 (0, 0) 处绘制时所覆盖的像素集。
请注意,边界矩形可能会扩展到(0,0)的左侧,例如斜体字体,而且返回的矩形宽度可能与horizontalAdvance() 方法返回的宽度不同。
如果您想知道字符串的预宽度(以便将一组字符串排列在一起),请使用horizontalAdvance() 代替。
换行符将作为普通字符而非换行符处理。
此函数在 Qt 6.3 中引入。
另请参阅 horizontalAdvance()、height() 和boundingRect()。
int QFontMetrics::underlinePos() const
返回从基线到应画下划线位置的距离。
另请参阅 overlinePos()、strikeOutPos() 和lineWidth()。
int QFontMetrics::xHeight() const
返回字体的 "x "高度。这通常与字符 "x "的高度相同,但并非总是如此。
bool QFontMetrics::operator!=(const QFontMetrics &other) const
如果other 不等于此对象,则返回true
;否则返回false
。
如果两个字体度量值是由相同的QFont 构建的,并且它们所用于的喷涂设备被认为是兼容的,则这两个字体度量值被认为是相等的。
另请参阅 operator==().
[noexcept]
QFontMetrics &QFontMetrics::operator=(QFontMetrics &&other)
Move-assignsother 到此QFontMetrics 实例。
QFontMetrics &QFontMetrics::operator=(const QFontMetrics &fm)
分配字体度量值fm 。
bool QFontMetrics::operator==(const QFontMetrics &other) const
如果other 与此对象相等,则返回true
;否则返回false
。
如果两个字体度量值是由相同的QFont 构建的,并且它们所用于的喷涂设备被认为是兼容的,则这两个字体度量值被认为是相等的。
另请参阅 operator!=()。
© 2025 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.