C++ (Qt)QVector<QRectF> CalcRectsForLines(QRect boundingRect, const QFontMetrics& fm, const QString& source ){ QVector<QRectF> result; double xPos = 0, yPos = 0; int lineCount = 0; const double lineHeight = fm.height(); const double spaceWidth = fm.width(" "); QStringList lineBreakList = source.split("\n"); foreach(QString line, lineBreakList) { double leftWidth = 0; xPos = 0, yPos = lineCount*lineHeight; QStringList spacesList = line.split(" ", QString::SkipEmptyParts); foreach(QString word, spacesList) { double wordWidth = fm.width(word); if( leftWidth + wordWidth >= boundingRect.width() ) { ++lineCount; xPos = 0; yPos = lineCount*lineHeight; leftWidth = 0; } QRectF wordRect = QRectF(xPos, yPos, wordWidth, lineHeight); result.push_back(wordRect); leftWidth += wordWidth + spaceWidth; xPos += wordWidth + spaceWidth; } ++lineCount; } double heightDispl = (boundingRect.height() - lineCount*lineHeight)/2; for( int i = 0; i < result.size(); ++i ) result[i].moveTop(result[i].y() + heightDispl); return result;}