QFontMetrics boundingRect

Posted

技术标签:

【中文标题】QFontMetrics boundingRect【英文标题】: 【发布时间】:2016-06-20 12:55:05 【问题描述】:

我在使用 QFontMetrics 'boundingRect' 函数时遇到问题,它没有返回正确的结果。

    mfntArial = QFont("Arial", 12, QFont::Bold);
    QFontMetrics objMetrics(mfntArial);
    QRect rctLine = objMetrics.boundingRect("LOS");

在调试器中,rctLine 包含:

    x1 : 1
    x2 : 26
    y1 : -16
    y2 : 4

这很令人困惑,我希望 x1 和 y1 都为 0,因为没有传递参考位置,我希望 x2 和 y2 都是正数。

返回的矩形不正确,如果我将它与 drawText 和对齐一起使用,则显示中缺少部分字符串。

我知道还有其他关于此函数如何返回错误结果的帖子,我已经查看了这些帖子,但它们对我没有帮助。

我在 RedHat 7.2 上使用 Qt5.6。

我也试过了:

    QRect rctParent = pobjParent->geometry();
    QRect rctLine = objMetrics.boundingRect(rctParent, intAlign, "LOS");

其中 pobjParent 是父窗口小部件,而 rctParent 包含:

    x1 : 8
    x2 : 289
    y1 : 24
    y2 : 447

intAlign 包含 33(左、上)

在这种情况下,rctLine 返回:

    x1 : 8
    x2 : 35
    y1 : 24
    y2 : 44

但边界矩形仍然很小,渲染时缺少部分“S”。

Official Qt documentation on QFontMetrics

【问题讨论】:

同样的问题here。文档here. 【参考方案1】:

我通过计算我认为是最宽字符之一“M”的宽度解决了我的问题。

    QRect rctCapM = objMetrics.boundingRect(rctParent, intAlign, "M");

然后我以此为典型,然后计算其他字符串所需的边界矩形:

    QRect rctBounds(0, 0, rctCapM.width() * strLine.length(), rctCapM.height());

其中 'strLine' 包含要显示和计算边界的字符串,这对我有用。

【讨论】:

以上是关于QFontMetrics boundingRect的主要内容,如果未能解决你的问题,请参考以下文章

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

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

如何解释 QFontMetrics 结果?

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

为啥 QFontMetrics 提供的宽度与 Qml Rectangle/Text 显示的宽度不匹配

QGraphicsRectItem.boundingRect() 在移动期间未更新