Inside of my QGraphicsRectItem::paint(), I am trying to draw the name of the item within its rect(). However, for each of the different items, they can be of variable width
Follow function based on the answer and comment to the answer allow optimizing font size to fit text in specified rectangle:
QFont optimizeFontSizeToFitTextInRect(QPainter * painter, QRectF drawRect, QString text, int flags = Qt::TextDontClip|Qt::TextWordWrap, double goalError = 0.01, int maxIterationNumber=10){
painter->save();
QRect fontBoundRect;
QFont font;
double minError = std::numeric_limits::max();
double error = std::numeric_limits::max();
int iterationNumber=0;
while((error > goalError) && (iterationNumberfontMetrics().boundingRect(drawRect.toRect(),flags, text);
double xFactor = drawRect.width() / fontBoundRect.width();
double yFactor = drawRect.height() / fontBoundRect.height();
double factor;
if (xFactor<1 && yFactor<1) {
factor = std::min(xFactor,yFactor);
} else if (xFactor>1 && yFactor>1) {
factor = std::max(xFactor,yFactor);
} else if (xFactor<1 && yFactor>1) {
factor = xFactor;
} else {
factor = yFactor;
}
error = abs(factor-1);
if (factor > 1 ) {
if (error < minError) {
minError = error;
} else {
break;
}
}
font = painter->font();
font.setPointSizeF(font.pointSizeF()*factor);
painter->setFont(font);
}
painter->restore();
return font;
}