我正在使用主要的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来编辑图像的不透明度。
答案 0 :(得分:0)
您无法在其paintEvent
方法之外的小部件上绘画。也许你想让画家在pixmap(painter(&map)
)而不是小工具(painter(this)
)上工作?
您还可以通过以下方式添加叠加层:
在派生场景的重新实现的paintEvent
中绘制它,确保不在场景上绘制,而是在viewport()
上绘制。视图的paintEvent
会调用便捷方法,例如drawBackground
和drawForeground
。
将其绘制为通用QWidget
叠加层。
我有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);
}