You are calling fillRect() on the painter's rect which holds the widget's rect. There is no "outside" here.
self._rect is not the entire area of the QPainter. It's just a subsection and this works corrctly. The problem is that everything else was drawn white.

However I did not realize that calling QPainter::begin made the entire client area subject to the painter. Is there a method of QGLWidget to return a subsection of its client area as something that can be passed to QPainter?