3

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

在此处输入图像描述

我明白我必须重新实现QGraphicsTextItem::paint函数,但我被协调系统困住了。这是代码(Label类继承公共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 );
}

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

4

3 回答 3

3

我以这种方式解决了一个问题 - 为了绘制我想要转换的线/圆/矩形/路径,我使用了适当的QGraphicsLine / Ellipse / Rect / PathItem。为了绘制文本(我不想被转换),我使用QGraphicsSimpleTextItem。我将文本的标志设置为忽略变形并将其父项设置为 Line/Ellipse/Rect/Path 项。Line/Ellipse/Rect/Path 项会转换,但文本不会 - 这就是我想要的。我还可以旋转文本并设置它的位置。非常感谢您的回答。

于 2015-02-23T17:20:37.557 回答
1

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

当您放大时,如果您更改比例ds,例如,将项目缩放1.0 / ds

你可能需要改变他们的立场。

我希望这有帮助。

编辑:我希望我正确理解了这个问题。

于 2015-02-04T14:34:30.057 回答
1

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

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);
于 2016-11-14T01:07:33.997 回答