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.
}
您可以将QGraphicsItem::ItemIgnoresTransformations
标志添加到您不想缩放的像素图项目中。
项忽略继承变换(即,其位置被 仍锚定在其父母,但父或视图旋转,缩放或剪切 变换被忽略)。此标志对于保持 文本标签项目水平和未缩放非常有用,因此如果视图已转换,它们仍可以是 。设置后,项目的视图 几何和场景几何将分开维护。您必须调用deviceTransform()来调用 视图中的坐标并检测碰撞。默认情况下,该标志被禁用。此标志是在 Qt 4.3中引入的。注意:有了这个标志集,你仍然可以缩放物品本身, ,这个缩放转换会影响物品的孩子。
使用setFlag
功能做:
pixmapItem->setFlag(QGraphicsItem::ItemIgnoresTransformations);
此标志不会阻止GraphicsView远离项目,说,ensureVisible() –
此标志只影响视图得到缩放的项目。没有处理场景平移的标志。如果您希望对象始终在同一位置可见,除了此标志,每当发生场景重新绘制时您都应明确调用这些项目的setPos – pnezis
我喜欢戴夫的答案;对于一个简单的HUD来说,这将是一个好方法。但是,您可以在不进行子类化和手动绘制的情况下执行此类操作:只需创建两个场景和两个视图,并将它们放在彼此的顶部,例如放置在QGridLayout的同一个位置。因此,你有两个完全独立的“图层”就像你想要的一样。
不幸的是,当视图滚动时它不起作用。它仅适用于使整个视图无效的转换。 – ybungalobill