For Qt 4.6.x, how to auto-size text to fit in a specified width?
Johannes from qtcentre.org offered the following solution:
float factor = rect().width() / painter->fontMetrics().width(name);
if ((factor < 1) || (factor > 1.25))
{
QFont f = painter->font();
f.setPointSizeF(f.pointSizeF()*factor);
painter->setFont(f);
}
I gave it a try in my program and so far, it seems to work quite well. I like it because it produces results in one pass, but it assumes that font width scales like its height.
http://www.qtcentre.org/threads/27839-For-Qt-4-6-x-how-to-auto-size-text-to-fit-in-a-specified-width
void myClass::adaptFontSize(QPainter * painter, int flags, QRectF drawRect, QString text){
int flags = Qt::TextDontClip|Qt::TextWordWrap; //more flags if needed
QRect fontBoundRect =
painter->fontMetrics().boundingRect(drawRect.toRect(),flags, text);
float xFactor = drawRect.width() / fontBoundRect.width();
float yFactor = drawRect.height() / fontBoundRect.height();
float factor = xFactor < yFactor ? xFactor : yFactor;
QFont f = painter->font();
f.setPointSizeF(f.pointSizeF()*factor);
painter->setFont(f);
}
or more accurate but greedy
void myClass::adaptFontSize(QPainter * painter, int flags, QRectF rect, QString text, QFont font){
QRect fontBoundRect;
fontBoundRect = painter->fontMetrics().boundingRect(rect.toRect(),flags, text);
while(rect.width() < fontBoundRect.width() || rect.height() < fontBoundRect.height()){
font.setPointSizeF(font.pointSizeF()*0.95);
painter->setFont(font);
fontBoundRect = painter->fontMetrics().boundingRect(rect.toRect(),flags, text);
}
}
Here is my code the fit (in heigth) a text, works quite well (error < 2% I guess)
void scalePainterFontSizeToFit(QPainter &painter, QFont &r_font, float _heightToFitIn)
{
float oldFontSize, newFontSize, oldHeight;
// Init
oldFontSize=r_font.pointSizeF();
// Loop
for (int i=0 ; i<3 ; i++)
{
oldHeight = painter.fontMetrics().boundingRect('D').height();
newFontSize = (_heightToFitIn / oldHeight) * oldFontSize;
r_font.setPointSizeF(newFontSize);
painter.setFont(r_font);
oldFontSize = newFontSize;
//qDebug() << "OldFontSize=" << oldFontSize << "HtoFitIn=" << _heightToFitIn << " fontHeight=" << oldHeight << " newFontSize=" << newFontSize;
}
// End
r_font.setPointSizeF(newFontSize);
painter.setFont(r_font);
}
You could have a QGraphicsTextItem as a child of the rect item, measure the text item's width and then scale the text item (setTransform()) to fit into the rect item's width (and height).