QFontMetrics 给出等宽字体的奇怪结果

Posted

技术标签:

【中文标题】QFontMetrics 给出等宽字体的奇怪结果【英文标题】:QFontMetrics give strange results for monospace font 【发布时间】:2019-01-25 15:51:40 【问题描述】:

有人向我解释一下这个测试程序的结果吗?

#include <QApplication>
#include <QDebug>
#include <QFontMetrics>
int main(int argc, char *argv[])

    QApplication app(argc, argv);
    QFont font;
    font.fromString("Monospace,14");
    QFontMetrics fm(font);
    qDebug() << "W       : " << fm.width('W');
    qDebug() << "8*W     : " << 8*fm.width('W');
    qDebug() << "WWWWWWWW: " << fm.width("WWWWWWWW"); // 8*W
    return 0;

用 Qt5.11 编译这段代码后,我得到了这样的结果:

W       :  11
8*W     :  88
WWWWWWWW:  92

这个等宽字体的一个字符“W”的大小是 11。我希望由 8 个这样的字符组成的字符串的大小应该是 88。但是 QFontmetrics::width 返回 92!

【问题讨论】:

仅供参考,因为我也在寻找解释,看来 width() 现在已经过时了doc.qt.io/qt-5/qfontmetricsf-obsolete.html#width-1 无法复制它。我看到 21,168,168 .....Windows Qt 5.12 Linux Qt 5.12: 11,88,92 在 Windows 7 上的 Qt 5.6.3 或 Qt5.9.1 上无法重现。在使用 horizontalAdvance() 而不是 width() 时,您会得到类似的结果吗? @Mike 是的,horizo​​ntalAdvance() 给出相同的结果 【参考方案1】:

问题在于四舍五入。如果我使用QFontMetricsF 而不是QFontMetrics 结果是正确的

W       :  11.4375
8*W     :  91.5
WWWWWWWW:  91.5

但是我发现了另一个奇怪的事情。 QFontMetricsF::maxWidth() 应该返回 qreal 类型,但实际上它总是返回舍入值(在我的示例中为 11)。它看起来像 Qt 中的错误。 https://bugreports.qt.io/projects/QTBUG/issues/QTBUG-73458?filter=allopenissues

【讨论】:

以上是关于QFontMetrics 给出等宽字体的奇怪结果的主要内容,如果未能解决你的问题,请参考以下文章

Qt 浅析QFontMetrics 获取字体宽度,高度

这个等宽字体的名称是啥?电脑目前没在手头上,只记得好像跟记事本里的默认字体一样。只要回答是啥字

等宽字体的介绍

如何解释 QFontMetrics 结果?

等宽字体都有哪些

如何设置动态 QFont 大小?