防止 QGraphicsItem 中的字体缩放
Preventing font scale in QGraphicsItem
我正在使用 QGraphicsTextItem 在场景上绘制文本。文本沿路径绘制 (QGraphicsPathItem),它是我的 QGraphicsTextItem 的父级 - 因此文本旋转更改为沿路径元素并且缩放视图时会粘在上面。但是 QGraphicsTextItem 的字体大小也在缩放视图时发生变化 - 这是我试图避免的。我将 QGraphicsItem::ItemIgnoresTransformations 标志设置为 QGraphicsTextItem 它在父级时停止旋转(QGraphicsPathItem)
我知道我必须重新实现 QGraphicsTextItem::paint 函数,但我受困于协调系统。这是代码(Labelclass继承publicQGraphicsTextItem):
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 );
}
我的文本在屏幕上的位置(和旋转)是不可预测的:(
我究竟做错了什么?非常感谢您。
我遇到过一次这个问题。您需要在放大功能中缩小您不想放大的项目,而不是忽略转换。
放大时,如果您将缩放比例更改 ds
,例如,将项目缩放 1.0 / ds
虽然你可能需要改变他们的位置。
希望对您有所帮助。
编辑:希望我理解正确。
我用这种方式解决了一个问题 - 为了绘制一个 line/circle/rectangle/path, 我想对其进行转换,我使用了适当的 QGraphicsLine/椭圆/矩形/PathItem。为了绘制文本(我不想被转换)我使用QGraphicsSimpleTextItem。我将文本的标志设置为忽略转换并将其父项设置为 Line/Ellipse/Rect/Path 项。 Line/Ellipse/Rect/Path 项变换,但文本不变换 - 这就是我想要的。我还可以旋转文本并设置它的位置。
非常感谢您的回答。
以下解决方案非常适合我:
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 乘以我们希望在 save/restore 环境之外保持其大小不变的其他度量。
QPointF ref(500, 500);
QPointF vector = scaleValue * QPointF(100, 100);
painter->drawLine(ref+vector, ref-vector);
我正在使用 QGraphicsTextItem 在场景上绘制文本。文本沿路径绘制 (QGraphicsPathItem),它是我的 QGraphicsTextItem 的父级 - 因此文本旋转更改为沿路径元素并且缩放视图时会粘在上面。但是 QGraphicsTextItem 的字体大小也在缩放视图时发生变化 - 这是我试图避免的。我将 QGraphicsItem::ItemIgnoresTransformations 标志设置为 QGraphicsTextItem 它在父级时停止旋转(QGraphicsPathItem)
我知道我必须重新实现 QGraphicsTextItem::paint 函数,但我受困于协调系统。这是代码(Labelclass继承publicQGraphicsTextItem):
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 );
}
我的文本在屏幕上的位置(和旋转)是不可预测的:( 我究竟做错了什么?非常感谢您。
我遇到过一次这个问题。您需要在放大功能中缩小您不想放大的项目,而不是忽略转换。
放大时,如果您将缩放比例更改 ds
,例如,将项目缩放 1.0 / ds
虽然你可能需要改变他们的位置。
希望对您有所帮助。
编辑:希望我理解正确。
我用这种方式解决了一个问题 - 为了绘制一个 line/circle/rectangle/path, 我想对其进行转换,我使用了适当的 QGraphicsLine/椭圆/矩形/PathItem。为了绘制文本(我不想被转换)我使用QGraphicsSimpleTextItem。我将文本的标志设置为忽略转换并将其父项设置为 Line/Ellipse/Rect/Path 项。 Line/Ellipse/Rect/Path 项变换,但文本不变换 - 这就是我想要的。我还可以旋转文本并设置它的位置。 非常感谢您的回答。
以下解决方案非常适合我:
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 乘以我们希望在 save/restore 环境之外保持其大小不变的其他度量。
QPointF ref(500, 500);
QPointF vector = scaleValue * QPointF(100, 100);
painter->drawLine(ref+vector, ref-vector);