我使用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);
}
有了这个,产生的输出是:
如您所见,第一个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");
}
产生预期结果:
答案 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()方法返回的宽度不同。
所以你所看到的是预期的行为。