QGraphicsView前景中的平铺图像

时间:2015-07-16 20:06:23

标签: qt qgraphicsview qpixmap

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

此视图可以显示和切换不同的QgraphicsScenes。此应用程序需要始终在每个场景前面叠加,因此执行此叠加的最佳方法是使用QGraphicsView的setForegroundBrush()方法。

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

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

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来编辑图像的不透明度。

2 个答案:

答案 0 :(得分:0)

您无法在其paintEvent方法之外的小部件上绘画。也许你想让画家在pixmap(painter(&map))而不是小工具(painter(this))上工作?

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

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

  2. 将其绘制为通用QWidget叠加层。

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

答案 1 :(得分:0)

最后,我认为在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);
}