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);
无论您是在有换行问题的系统还是没有问题的系统上,它都会正确呈现。
我想画一个相当简单的图,我在圆的中心写了两段文字。我的代码:
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);
无论您是在有换行问题的系统还是没有问题的系统上,它都会正确呈现。