问题描述
我有一个QGraphicsTextItem,它是QGraphicsItem的父项。我希望QGraphicsTextItem始终位于QGraphicsItem的正上方,但我也希望文本在比例因子小于1时保持相同的大小,即文本保持其比例因子1的大小,即使父图形项的比例更小。我发现,当比例因子小于1时,将QGraphicsItem::ItemIgnoresTransformations
标志设置为真确实可以保持大小。
但我似乎找不到一种方法来使文本的位置始终保持在QGraphicsItem之上。有什么办法可以做到这一点吗?我尝试使用deviceTransform ()
函数,但当我滚动时,文本仍从QGraphicsItem移出。更糟糕的是,一些文本项开始"抖动",也就是说,它们开始不断地轻微地改变位置,以至于看起来它们在抖动。如果这是我需要使用的函数,我想我不知道如何正确使用它。
在QGraphicsItem的构造函数中,我添加了一个QGraphicsTextItem:
fTextItem = new QGraphicsTextItem(getName(), this);
fTextItem->setFlag(QGraphicsItem::ItemIgnoresTransformations);
以下是QGraphicsItem的Paint函数的代码片段
qreal lod = painter->worldTransform().m22();
if(lod <= 1.0) {
fTextItem-setFlag(QGraphicsItem::ItemIgnoresTransformations);
fTextItem->setPos(fTextItem->deviceTransform(view-viewportTransform()).inverted().map(view->mapFromScene(mapToScene(0,0))));
} else {
fTextItem->setFlag(QGraphicsItem::ItemIgnoresTransformations, false);
fTextItem->setPos(0, 0);
}
推荐答案
免责声明:对于您试图做的事情来说,这可能是矫枉过正。我们的项目中有一些其他限制,使此解决方案对我们来说是最简单的。
我们必须在项目中做一些类似的事情,结果对我们来说最容易的是不使用ItemIgnoresTransformations
,而是滚动我们自己的转换。下面是我们用来创建仅平移(无缩放)转换的主要函数,用于在特定位置绘制项目。您或许能够根据自己的用途对其进行修改。
static QTransform GenerateTranslationOnlyTransform(
const QTransform &original_transform,
const QPointF &target_point) {
// To draw the unscaled icons, we desire a transform with scaling factors
// of 1 and shearing factors of 0 and the appropriate translation such that
// our icon center ends up at the same point. According to the
// documentation, QTransform transforms a point in the plane to another
// point using the following formulas:
// x' = m11*x + m21*y + dx
// y' = m22*y + m12*x + dy
//
// For our new transform, m11 and m22 (scaling) are 1, and m21 and m12
// (shearing) are 0. Since we want x' and y' to be the same, we have the
// following equations:
// m11*x + m21*y + dx = x + dx[new]
// m22*y + m12*x + dy = y + dy[new]
//
// Thus,
// dx[new] = m11*x - x + m21*y + dx
// dy[new] = m22*y - y + m12*x + dy
qreal dx = original_transform.m11() * target_point.x()
- target_point.x()
+ original_transform.m21() * target_point.y()
+ original_transform.m31();
qreal dy = original_transform.m22() * target_point.y()
- target_point.y()
+ original_transform.m12() * target_point.x()
+ original_transform.m32();
return QTransform::fromTranslate(dx, dy);
}
若要使用,请获取传递给Paint方法的QPainter
转换并执行如下操作:
painter->save();
painter->setTransform(GenerateTranslationOnlyTransform(painter->transform(),
some_point));
// Draw your item.
painter->restore();
这篇关于应用QGraphicsItem::ItemIgnoresTransformations后保持相对子位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!