Qt::AlignCenter 的 QPainter 没有正确居中文本

QPainter with Qt::AlignCenter does not center text correctly

我想画一个相当简单的图,我在圆的中心写了两段文字。我的代码:

    painter->drawText(QRectF(0, 0, m_iSize, m_iSize), Qt::AlignCenter, m_sAlias + "\n" + m_sCode);

其中m_iSize是圆的大小,m_sAlias是像"R1"这样的短文本,m_sCode是另一个短文本,例如 "31".

问题是上面的代码将绘制两行文本,使它们在水平方向上恰好相隔一个像素。不幸的是,它清晰可见。我怀疑“\n”必须对它做些什么,但我不知道。也不知道怎么解决。

我目前的解决方法是像这样分别绘制文本:

    painter->drawText(QRectF(1, 0, m_iSize, m_iSize), Qt::AlignCenter, m_sAlias + "\n");
    painter->drawText(QRectF(0, 0, m_iSize, m_iSize), Qt::AlignCenter, "\n" + m_sCode);

但这只是愚蠢,即使它确实按预期工作(我将顶部文本向右移动一个像素)。

我在这里错过了什么?如果需要我可以提供截图。

截图:

错误(第一行代码),行之间移动了一个像素

正确(第二个两行代码),行对齐正确

我无法重现这个问题,但我在不同的系统上使用不同的默认字体。可能是您使用的字体为新行字符指定了 1 px 宽度,或者 Qt 像这样误解了它。您绝对应该尝试使用另一种字体会发生什么。

无论如何,您可以改用此解决方法:

painter->drawText(QRectF(0, 0, m_iSize, m_iSize), Qt::AlignCenter | Qt::AlignTop, m_sAlias);
painter->drawText(QRectF(0, 0, m_iSize, m_iSize), Qt::AlignCenter | Qt::AlignBottom, m_sCode);

无论您是在有换行问题的系统还是没有问题的系统上,它都会正确呈现。