我正在使用 QGraphicsTextItem 在场景上绘制文本。文本沿路径 ( QGraphicsPathItem ) 绘制,它是我的 QGraphicsTextItem 的父级 - 因此文本旋转更改为沿路径元素旋转并在缩放 View 时粘在它上面。但是 QGraphicsTextItem 的字体大小也在缩放 View 时发生变化 - 这就是我试图避免的。我将 QGraphicsItem::ItemIgnoresTransformations 标志设置为 QGraphicsTextItem 它停止旋转,而它是父( QGraphicsPathItem )。

我知道我必须重新实现 QGraphicsTextItem::paint 函数,但我坚持使用协调系统。这是代码( 标签 类继承了 public QGraphicsTextItem ):

void Label::paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget )
{
    // Store current position and rotation
    QPointF position = pos();
    qreal angle = rotation();

    // Store current transformation matrix
    QTransform transform = painter->worldTransform();

    // Reset painter transformation
    painter->setTransform( QTransform() );

    // Rotate painter to the stored angle
    painter->rotate( angle );

    // Draw the text
    painter->drawText( mapToScene( position ), toPlainText() );

    // Restore transformation matrix
    painter->setTransform( transform );
}

我的文本在屏幕上的位置(和旋转)是不可预测的 :(
我究竟做错了什么?非常感谢您提前。

最佳答案

以下解决方案对我来说非常有效:

void MyDerivedQGraphicsItem::paint(QPainter *painter, const StyleOptionGraphicsItem *option, QWidget *widget)
{
    double scaleValue = scale()/painter->transform().m11();
    painter->save();
    painter->scale(scaleValue, scaleValue);
    painter->drawText(...);
    painter->restore();
    ...
}

我们还可以将 scaleValue 乘以我们希望在保存/恢复环境之外保持其大小不变的其他度量。
QPointF ref(500, 500);
QPointF vector = scaleValue * QPointF(100, 100);
painter->drawLine(ref+vector, ref-vector);

关于qt - 防止 QGraphicsItem 中的字体缩放,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28301470/

10-11 20:31