QGraphicsView 前景中的平铺图像

Tiled image in QGraphicsView foreground

我正在开发一个使用主 QGraphicsView 制作的 Qt 应用程序。

这个视图可以显示和切换不同的QgraphicsScenes。此应用程序需要在每个场景前面始终有一个叠加层,因此实现此叠加层的最佳方法是通过 QGraphicsView 的 setForegroundBrush() 方法。

但我的叠加层是平铺图像,我可以在其中编辑源图像的不透明度和比例。

这是在我的 QGraphicsView class 构造函数中编写的代码:

QString imgPath("path/to/image.png");
QPixmap map(imgPath);
QPainter painter(this);
QRectF zone(0,0,map.width(),map.height());
painter.drawPixmap(zone,map,zone);
QBrush brush = painter.brush();
brush.setStyle(Qt::TexturePattern);
setForegroundBrush(brush);

但是不起作用,没有显示任何内容。 我用 QPixmap 测试了一个简单的 QBrush 并且工作正常,但我需要使用 QPainter 才能编辑我的图像的不透明度。

您不能在 paintEvent 方法之外的小部件上绘画。也许您想让画家在像素图 (painter(&map)) 而不是小部件 (painter(this)) 上工作?

您还可以通过以下方式添加叠加层:

  1. 在派生场景的重新实现 paintEvent 中绘制它,确保不是在场景上绘制,而是在其 viewport() 上绘制。有视图的 paintEvent 调用的便捷方法,例如 drawBackgrounddrawForeground.

  2. 在通用 QWidget 叠加层中绘制它。

我有 several answers 演示了如何在一般情况下以及在场景视图上覆盖小部件。

最后,我认为在 QGraphicsView 前景中使用平铺图像的最简单方法是重新实现 drawForeground(QPainter *painter, const QRectF &rect)

void Frontend::drawForeground(QPainter *painter, const QRectF &rect){
    float alpha = 0.15;
    float scale = 2;
    QString imgPath("path/to/image.png");
    QPixmap img(imgPath);
    painter->scale(scale,scale);
    painter->setOpacity(alpha);
    painter->drawTiledPixmap(rect,img);
}