如何在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
相关产品推荐
相关产品推荐

