QPainter::setClipRect、setClipPathを使用すると、指定した領域に限定して描画することができます。逆に、指定した領域を除外して描画するにはどうしたら良いか、Twitterで尋ねたら@task_jpさんが教えてくださいました。
このテクニックの肝は、QPainterPath::subtractedを使用するというところです。
void MyCentralWidget::paintEvent(QPaintEvent *) { QPainter pr(this); QPainterPath entire_path; entire_path.addRect(rect()); QPainterPath exclude_path; exclude_path.addEllipse(width() / 4, height() / 4, width() / 2, height() / 2); QPainterPath clip_path = entire_path.subtracted(exclude_path); pr.setClipPath(clip_path); for (int i = 0; i < 100; i++) { int x0 = rand() % width(); int y0 = rand() % height(); int x1 = rand() % width(); int y1 = rand() % height(); QRect r(x0, y0, x1 - x0, y1 - y0); pr.setPen(QColor(rand() % 256, rand() % 256, rand() % 256)); pr.drawEllipse(r); } }最初に、描画領域全体の矩形のパスを作っておき、次に、除外したい領域のパスを作り、subtracted(引き算)してから、setClipPathします。