防止QGraphicsItem中的字体缩放

时间:2015-02-03 14:35:26

标签: qt font-size zooming qgraphicstextitem

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

enter image description here

我明白我必须重新实现 QGraphicsTextItem :: paint 功能,但我仍然坚持使用协调系统。以下是代码(标签类继承公共 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 );
}

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

3 个答案:

答案 0 :(得分:3)

我用这种方式解决了一个问题 - 为了画一条线/圆/矩形/路径,我想要转换,我使用了一个合适的 QGraphicsLine / 椭圆 / <强>的Rect / <强> PathItem 即可。为了绘制文本(我不想转换),我使用 QGraphicsSimpleTextItem 。我设置文本标记以忽略transormations并将其父级设置为Line / Ellipse / Rect / Path项目。线/椭圆/矩形/路径项转换,但文本不转换 - 这是我想要的。我也可以旋转文字并设置它的位置。 非常感谢您的回答。

答案 1 :(得分:1)

我曾经遇到过这个问题。您无需忽略转换,而是需要缩小您不希望在放大功能中放大的项目。

放大时,如果您按比例ds更改比例,请按1.0 / ds

缩放项目

你可能需要改变他们的位置。

我希望这会有所帮助。

编辑:我希望我能理解这个问题。

答案 2 :(得分:0)

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

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);