如何为drawText旋转文本?

7

我想要将文本旋转45度?

QFont font;
font.setPixelSize(12);

//grid
for(int i = 0; i < 10; i++){
    painter->drawLine(100, 100 + i * 800/9, 900, 100 + i * 800/9);
    str = QString::number((double)9 - i, 'd', 1);
    painter->setFont(font);
    painter->drawText(75, 100 + i * 800/9 - 6, 40, 40, 1, str);
}
4个回答

12

painter->drawText(75, 100 + i * 800/9 - 6, 40, 40, 1, str); 之前插入 painter->rotate(45);,并在之后插入 painter->rotate(-45); (以恢复坐标系的旋转角度):

painter->rotate(45);
painter->drawText(75, 100 + i * 800/9 - 6, 40, 40, 1, str);
painter->rotate(-45);

根据您所说的是顺时针还是逆时针旋转45度,您可能需要取反旋转角度。

旋转坐标系后,您绘制的所有内容都将被旋转绘制,直到您恢复绘制器。保存和恢复绘图器状态的便捷方法是使用 QPainter::save()QPainter::restore()


3
但是QPainter.rotate()会旋转坐标系,因此现在drawText中的x和y坐标是不正确的。 - Allex

6
painter->save(); // saves current painter state
// painter->rotate(45); clockwise rotation 
// painter->rotate(-45); counter clockwise rotation
painter->restore(); // restores painter state

1
既可以省略rotate(-45),也可以省略save/restore。 - Frank Osterfeld

4
为了旋转您使用painter绘制的文本(和任何其他可绘制对象),只需调用以下命令:
painter->rotate(yourAngle);

之前

painter->drawText();

如果您想返回到之前的状态,请再次调用旋转。
painter->rotate(-yourAngle);

2
为什么把一个简单的任务搞得这么复杂?!!!
void CustomLabel::paintEvent(QPaintEvent* e)
{
    QPainter painter(this);

    painter.translate(m_rect.center());
    painter.rotate(m_rotation);
    painter.translate(-m_rect.center());
    painter.drawText(m_rect, Qt::AlignHCenter | Qt::AlignVCenter, m_text);

    QWidget::paintEvent(e);
}

任何时候当CustomLabel的容器改变大小时,您可以设置m_rect或使用this->rect()本身。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接