QPainter.drawText斜体写在矩形之外

时间:2014-05-19 12:19:48

标签: qt

我使用QPainter.drawText来......嗯...画一些文字,但是在使用斜体字体时我遇到了问题,其中文字是在给定的QRectF之外写的。

以下是示例代码:

void TestApplication::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QRectF rect(100,100,100,100);
QRectF necessary;
QFont font("Times New Roman", 30);

    font.setItalic(true);   
    painter.setFont(font);  


    painter.fillRect(rect, QColor(0,255,0));
    painter.drawText(rect, Qt::AlignLeft|Qt::AlignVCenter, "ff",&necessary);
}

有了这个,产生的输出是:

enter image description here

如您所见,第一个f写在定义的QRectF之外。如果我写了足够的文字,右边会发生同样的事情。我已经尝试将Qt :: TextDontClip添加到标志中,但它没有产生任何效果。

有人能帮助我吗?

修改

正如答案中所解释的,这是预期的行为。我已经能够通过使用leftBearing来解决它(解释在答案中),如下所示:

void TestApplication::paintEvent(QPaintEvent *)
{
QPainter        painter(this);
QRectF          rect(20,20,100,100);
QRectF          textRect;
QFont           font("Times New Roman", 40,0,true);

    font.setItalic(true);   
    painter.setFont(font);

    QFontMetrics    fontMetrics(font);  

    textRect = rect.adjusted(-fontMetrics.leftBearing('f'), 0, fontMetrics.leftBearing('f'), 0);

    painter.fillRect(rect, QColor(0,255,0));
    painter.drawText(textRect, Qt::AlignLeft|Qt::AlignTop, "ff");
}

产生预期结果:

enter image description here

1 个答案:

答案 0 :(得分:2)

最简单的处理方法是在绘制文本之前减少Rect,如果文本是italiced: -

QRectF rect(100,100,100,100);

QRectF textRect = rect.adjusted(8, 0, -8, 0);

painter.drawText(textRect, Qt::AlignLeft|Qt::AlignVCenter, "ff",&necessary);

作为Qt documentation状态,当传入boundingRect rect作为最后一个参数时: -

  

boundingRect(如果不为null)设置为边界矩形应该是什么,以便包含整个文本。

所以,它不一定受你传入的矩形的限制。

请注意,QFontMetrics类允许您获取呈现字符串所需的boundingRect: -

QFont font("Times New Roman", 30);
QFontMetrics fontMetrics(font);

fontMetrics.boundingRect("ff");

然而,documentation for QFontMetrics州: -

  

注意,边界矩形可以延伸到(0,0)的左边,例如,对于斜体字体,并且返回的矩形的宽度可能与width()方法返回的宽度不同。

所以你所看到的是预期的行为。