我正在使用 QGraphicsTextItem 在场景上绘制文字。文本沿路径绘制( QGraphicsPathItem ),它是我的 QGraphicsTextItem 的父级 - 因此文本旋转更改为沿着路径元素并在缩放时粘贴到它风景。但是在缩放视图时, QGraphicsTextItem 的字体大小也在变化 - 这就是我要避免的。我将 QGraphicsItem :: ItemIgnoresTransformations 标志设置为 QGraphicsTextItem ,它在父项( QGraphicsPathItem )的作用下停止旋转。
我明白我必须重新实现 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 );
}
我的文字在屏幕上的位置(和旋转)是不可预测的:( 我究竟做错了什么?非常感谢你提前。
答案 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);