You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中高效检测QFontMetrics文本是否被省略

C++中高效判断QFontMetrics省略文本是否被截断的方法

已有一个针对QML的Stack Overflow提问覆盖该问题,但我需要C++层面的解决方案。

我的代码示例如下:

QFontMetrics boldMetrics(boldFont);
auto elidedName = boldMetrics.elidedText(nameToElide, Qt::ElideMiddle, (ui->lDescription->width() - (textBoundingRect - NameBoundingRect - 1)));

elidedText的结果符合预期,但我需要检测文本是否真的被省略以执行后续处理。虽然可以检查elidedName是否包含"...",但我想找更高效的检测方式。原本期望elidedText能提供可选输出参数或重载版本返回该信息,但显然没有。QString和QFontMetrics似乎也未保存该信息。请问有没有无需低效字符串检查就能判断文本是否被省略的方法?

解决方案

直接通过比较原文本的实际宽度和允许的最大宽度就能高效判断,完全不需要字符串检查:

  • 用QFontMetrics::horizontalAdvance()(Qt 5.11及以上版本)计算原文本的总宽度,旧版本可以用width()替代:
int originalWidth = boldMetrics.horizontalAdvance(nameToElide);
  • 取出你传入elidedText的最大宽度值(即代码中的(ui->lDescription->width() - (textBoundingRect - NameBoundingRect - 1))),记为maxWidth
  • 直接比较:如果originalWidth > maxWidth,说明文本会被省略;反之则不会。

这种方式完全跳过了字符串生成和检查的开销,是性能最优的方案。

内容的提问来源于stack exchange,提问作者Mickaël C. Guimarães

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:45:49