Qt GraphicsScene:如何创建一个新图层?

问题描述:

我有一个QGraphicsView,显示QGraphicsScene。用户可以使用按钮缩放和平移场景。该操作通过QGraphicsView功能实现,如scale()。 现在我想绘制一些透明的pixmaps,它不会被用户操作转换。我如何将它们与graphicsView分开放置?Qt GraphicsScene:如何创建一个新图层?

如果你想成为在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. 
} 
+0

不幸的是,当视图滚动时它不起作用。它仅适用于使整个视图无效的转换。 – ybungalobill

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

项忽略继承变换(即,其位置被 仍锚定在其父母,但父或视图旋转,缩放或剪切 变换被忽略)。此标志对于保持 文本标签项目水平和未缩放非常有用,因此如果视图已转换,它们仍可以是 。设置后,项目的视图 几何和场景几何将分开维护。您必须调用deviceTransform()来调用 视图中的坐标并检测碰撞。默认情况下,该标志被禁用。此标志是在 Qt 4.3中引入的。注意:有了这个标志集,你仍然可以缩放物品本身, ,这个缩放转换会影响物品的孩子。

使用setFlag功能做:

pixmapItem->setFlag(QGraphicsItem::ItemIgnoresTransformations); 
+0

此标志不会阻止GraphicsView远离项目,说,ensureVisible() –

+0

此标志只影响视图得到缩放的项目。没有处理场景平移的标志。如果您希望对象始终在同一位置可见,除了此标志,每当发生场景重新绘制时您都应明确调用这些项目的setPos – pnezis

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