本文介绍了应用QGraphicsItem::ItemIgnoresTransformations后保持相对子位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个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后保持相对子位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

05-27 19:15