The following steps may work. It basically extends the normal QGraphicsScene with the ability to only display its background for any QPainter . Then, your cut-out graphic element simply displays the background of the scene on top of other elements. For this to work, the cut element must have the highest Z value.

#include <QtGui> class BackgroundDrawingScene : public QGraphicsScene { public: explicit BackgroundDrawingScene() : QGraphicsScene() {} void renderBackground(QPainter *painter, const QRectF &source, const QRectF &target) { painter->save(); painter->setWorldTransform( QTransform::fromTranslate(target.left() - source.left(), target.top() - source.top()), true); QGraphicsScene::drawBackground(painter, source); painter->restore(); } }; class CutOutGraphicsItem : public QGraphicsEllipseItem { public: explicit CutOutGraphicsItem(const QRectF &rect) : QGraphicsEllipseItem(rect) { setFlag(QGraphicsItem::ItemIsMovable); } protected: void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) { BackgroundDrawingScene *bgscene = dynamic_cast<BackgroundDrawingScene*>(scene()); if (!bgscene) { return; } painter->setClipPath(shape()); bgscene->renderBackground(painter, mapToScene(boundingRect()).boundingRect(), boundingRect()); } }; int main(int argc, char **argv) { QApplication app(argc, argv); BackgroundDrawingScene scene; QRadialGradient gradient(0, 0, 10); gradient.setSpread(QGradient::RepeatSpread); scene.setBackgroundBrush(gradient); scene.addRect(10., 10., 100., 50., QPen(Qt::SolidLine), QBrush(Qt::red)); scene.addItem(new CutOutGraphicsItem(QRectF(20., 20., 20., 20.))); QGraphicsView view(&scene); view.show(); return app.exec(); }
Dave mateer
source share