OK it seems I found the solution:
@ surface = self.parent().geometry()
self.setGeometry(surface)
path = QtGui.QPainterPath()
path.setFillRule(QtCore.Qt.OddEvenFill)
path.addRect(QtCore.QRectF(surface))
path.addRect(QtCore.QRectF(self.parent().rubberband.geometry()))
self.painter.begin(self)
self.painter.setBrush(QtGui.QBrush(QtGui.QColor(100, 100, 100, 70)))
self.painter.setPen(QtGui.QPen(QtGui.QColor(0, 0, 0, 80)))
self.painter.drawPath(path)
self.painter.end()@
Although I wonder whether this is the simplest solution? I'm surprised QPainter does not has a fill mode that allows to invert or exclude an area.