Skip to content

QPainter绘制文字换行

QPainter 不会处理所有转义字符

在使用QPainter的drawText方法绘制文本时,默认情况下不会识别换行符 \n\r\n。为了在指定位置换行,可以逐行打印文本,或者通过指定文本宽度实现自动换行。以下是两种方法的实现:

1 指定换行符

通过手动拆分文本并逐行绘制,实现换行效果:

painter->save();


QString text;
text = QString(
    u8"侧卧\n"
    "%1       P2TB -z与+y 夹角 (80~90)\n"
    "%2,%3 P2B xy (-50~50)(-600,-550)\n"
    "%4,%5 P2TB xy (-50~50)(-25~25)\n"
    "%6       P2B -z投影xz与+-x 夹角 (25~65)\n"
    "%7       P2B -z与+y 夹角 (80~90)\n"
    "%8       TB2B +y投影xy与+y 夹角"
)
    .arg(QString::number(step.data.at(0), 'f', 1))
    .arg(QString::number(step.data.at(1), 'f', 1))
    .arg(QString::number(step.data.at(2), 'f', 1))
    .arg(QString::number(step.data.at(3), 'f', 1))
    .arg(QString::number(step.data.at(4), 'f', 1))
    .arg(QString::number(step.data.at(5), 'f', 1))
    .arg(QString::number(step.data.at(6), 'f', 1))
    .arg(QString::number(step.data.at(7), 'f', 1));

int textX = m_LImgSize + 100;
int textY = 650;
QPen pen;
pen.setWidth(5);
pen.setStyle(Qt::PenStyle::SolidLine);
pen.setColor(Qt::white);
painter->setPen(pen);
QFont font;
font.setBold(true);
font.setPointSize(20);
painter->setFont(font);

QStringList lines = text.split("\n");
for (const QString& line : lines) {
    painter->drawText(textX, textY, line);
    textY += 40;
}


painter->restore();

2 自动换行

通过指定文本绘制的区域宽度,使得QPainter自动换行:

QRect textRect(textX, textY, textWidth, 500);
painter->drawText(textRect, Qt::TextWordWrap, text);