void MainWindow::drawMultiLineText(QPainter &painter, const QFont& fnt, const QString& text, int width)
{
QTextLayout textLayout(text, fnt);
textLayout.setCacheEnabled(true);
qreal height = 0;
qreal lineWidth = qMax(0, width);
textLayout.beginLayout();
QFontMetricsF fm(fnt);
qreal leading = fm.leading();
height = -leading;
while (true)
{
QTextLine line = textLayout.createLine();
if (!line.isValid()) break;
line.setLineWidth(lineWidth);
height += leading;
height = qCeil(height);
line.setPosition(QPointF(0.0, height));
height += line.height();
}
textLayout.endLayout();
for (int i = 0; i < textLayout.lineCount(); ++i)
{
QTextLine line = textLayout.lineAt(i);
int start = line.textStart();
int length = line.textLength();
QString lineText = text.mid(start, length);
if(line.naturalTextWidth()>width)
{
QString text = fm.elidedText(lineText, Qt::ElideRight, width);
painter.drawText(QPointF(line.x(), line.y()), text);
break;
}
painter.drawText(QPointF(line.x(), line.y()), lineText);
}
2.指定宽度和高度,绘画文本
void MainWindow::drawMultiLineText(QPainter &painter, const QFont& fnt, const QString& text, int width, int maxheight)
{
QTextLayout textLayout(text, fnt);
textLayout.setCacheEnabled(true);
qreal height = 50;
qreal lineWidth = qMax(0, width);
textLayout.beginLayout();
QFontMetricsF fm(fnt);
qreal leading = fm.leading();
height -= leading;
while (true)
{
QTextLine line = textLayout.createLine();
if (!line.isValid()) break;
line.setLineWidth(lineWidth);
height += leading;
line.setPosition(QPointF(0.0, height));
height += line.height();
}
textLayout.endLayout();
for (int i = 0; i < textLayout.lineCount(); ++i)
{
QTextLine line = textLayout.lineAt(i);
int start = line.textStart();
if(maxheight < (i+1)*line.height())
{
QString lineText = text.mid(start, text.length());
QString text = fm.elidedText(lineText, Qt::ElideRight, width);
QPointF fPoint(line.x(), line.y());
painter.drawText(fPoint, text);
return;
}
int length = line.textLength();
QString lineText = text.mid(start, length);
int iTextWidth = qCeil(line.naturalTextWidth());
if(iTextWidth>width)
{
QString text = fm.elidedText(lineText, Qt::ElideRight, width);
QPointF fPoint(line.x(), line.y());
painter.drawText(fPoint, text);
return;
}
else
{
QPointF fPoint(line.x(), line.y());
painter.drawText(fPoint, lineText);
}
}
}
3.指定行数,绘画文本。
只需要将指定高度的判断换为行数即可