Qt:缩放多边形但不是儿童

时间:2015-02-19 22:12:29

标签: c++ qt

我是Qt的新手。我使用继承QGraphicsPolygomItem的自定义类将我的应用程序中的事件表示为场景中的多边形。多边形尺寸为(event duration, fixed height),使用1s:1px。事件持续时间可以低至1E-6,因此我只是缩放视图,以便将较小的多边形放大到MIN_POLY_WIDTH(10px):

view->scale(qreal(MIN_POLY_WIDTH/min_event_duration), qreal(1.0));

enter image description here

到目前为止一切顺利。但是,每个多边形都有一个QGraphicsTextItem子元素,它通过缩放操作拉伸到它们超出多边形边界的点:

enter image description here

文本项创建如下:

void EventPolygon::setId(QString id) {                                     
  if (!this->id) {
    this->id = new QGraphicsTextItem(id, this);
  } else {
    this->id->setPlainText(id);
  }
  this->id->setPos(0, this->polygon().boundingRect().height() / 2 - this->id->boundingRect().height() / 2);
}

该函数通常由EventPolygon构造函数调用。我认为这是问题,因为scale是在所有项目添加到场景后完成的,因此会影响文本项目。所以我尝试在缩放操作之后调用setId ,迭代场景中的所有项目。那样的话,我只会拉伸多边形。事实并非如此,案文仍然紧张。

我还尝试使用以下代替scale

QTransform t = QTransform();                                                  
t.scale(qreal(MIN_POLY_WIDTH/min_event_duration), qreal(1.0));                           
view->setTransform(t, false);

我认为“假”会避免将变换应用于多边形子项,但似乎并非如此。有什么方法可以将多边形缩放到10px宽度min并在其中包含可读文本吗?

1 个答案:

答案 0 :(得分:1)

QGraphicsScene根据父子关系形成场景图层次结构,转换在此层次结构中继承 - 没有办法绕过它(参见转换部分here)。

因此,为了解决您的问题,您需要让子QGraphicsTextItem反转父级的缩放变换乘以视图的缩放。

实际上我真的建议您从不设置视图转换,因为这个原因不能模拟相机操作(平移,缩放等)。我只是允许每像素的秒数变化,并允许子项目从视图中查询 - 换句话说,进度项在屏幕上处理它们自己的大小。

  

情况并非如此,文字仍然很紧张。

更改转换堆栈会导致重绘,这就是 设置比例时无关紧要的原因。

  

我认为“假”会避免转换应用于   多边形儿童

不,{false}时的combine参数只会覆盖现有的转换矩阵与您提供的转换矩阵。