使用Qt :: AlignCenter的QPainter不能正确居中文本

时间:2015-09-04 18:38:29

标签: c++ qt qpainter

我想做一个相当简单的绘画,我在圆圈的中心写上两个文字。我的代码:

    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 个答案:

答案 0 :(得分:0)

我无法重现此问题,但我在不同的系统上使用不同的默认字体。可能是您使用的字体为新行字符指定了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);

无论您是在具有新线路问题的系统还是没有系统的系统上,它都将正确呈现。