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)
) 上工作?
您还可以通过以下方式添加叠加层:
在派生场景的重新实现 paintEvent
中绘制它,确保不是在场景上绘制,而是在其 viewport()
上绘制。有视图的 paintEvent
调用的便捷方法,例如 drawBackground
和 drawForeground
.
在通用 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);
}
我正在开发一个使用主 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)
) 上工作?
您还可以通过以下方式添加叠加层:
在派生场景的重新实现
paintEvent
中绘制它,确保不是在场景上绘制,而是在其viewport()
上绘制。有视图的paintEvent
调用的便捷方法,例如drawBackground
和drawForeground
.在通用
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);
}