我有QGraphicsView
,显示QGraphicsScene
。用户可以使用按钮缩放和平移场景。此操作通过QGraphicsView
函数实现,例如scale()
。
现在我想在它上面绘制一些透明的pixmaps,它们不会被用户操作转换。如何将它们与graphicsView
分开?
答案 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的同一位置。因此,您可以根据需要拥有两个完全独立的“层”。