Qgraphicsscene:如何创建新图层?

时间:2011-11-16 10:29:20

标签: qt graphics

我有QGraphicsView,显示QGraphicsScene。用户可以使用按钮缩放和平移场景。此操作通过QGraphicsView函数实现,例如scale()。 现在我想在它上面绘制一些透明的pixmaps,它们不会被用户操作转换。如何将它们与graphicsView分开?

3 个答案:

答案 0 :(得分:7)

如果您希望在完全QGraphicsView上绘制一些独立于场景变换的内容,您可以将QGraphicsView子类化并将这些项目作为其中的一部分绘制(被覆盖的paintEvent方法。

void MyView::paintEvent(QPaintEvent *event) {
  // Call the base paintEvent to do the "normal" stuff.
  QGraphicsView::paintEvent(event);

  // Paint your other stuff. Note that you have to create the QPainter on 
  // the viewport.
  QPainter painter(viewport());
  painter.setBrush(QBrush(Qt::black));
  // ... etc.
}

答案 1 :(得分:2)

您可以将QGraphicsItem::ItemIgnoresTransformations标志添加到您不想缩放的pixmap项目中。

  

该项忽略继承的转换(即,它的位置是   仍锚定到其父级,但父级或视图旋转,缩放或   剪切变换被忽略)。这个标志对于保持很有用   文本标签项目水平和未缩放,所以它们仍然是   如果视图已转换,则可读设置时,项目的视图   几何和场景几何将分开维护。你必须   调用deviceTransform()来映射坐标并检测中的碰撞   视图。默认情况下,禁用此标志。这个标志是介绍的   Qt 4.3。注意:设置此标志后,您仍可以缩放项目本身,   而且规模转换会影响项目的孩子。

使用setFlag功能执行此操作:

pixmapItem->setFlag(QGraphicsItem::ItemIgnoresTransformations);

答案 2 :(得分:0)

我喜欢戴夫的回答;对于简单的HUD来说这将是一个好方法。但是,您可以在没有子类化和手动绘制的情况下执行类似操作:只需创建两个场景和两个视图并将它们放在彼此之上,例如放入QGridLayout的同一位置。因此,您可以根据需要拥有两个完全独立的“层”。