Lijkt me wel een correcte oplossing. Wat je zegt klopt inderdaad volgens de documentatie "When the paint event occurs, the update region has normally been erased, so you are painting on the widget's background." De details van implementatie zijn niet duidelijk, dus het is mij niet 100% duidelijk waar het probleem nu precies zit, maar als de QWidgets het enige zichtbare zijn en je overal paintEvent() oproept en niets tekent zouden ze inderdaad leeg moeten zijn (en zodoende enkel hun eigen achtergrondkleur hebben).
QML (ook onderdeel van Qt 5) is mogelijk wel een betere kandidaat voor dit soort spelletjes!
Daar kan je in de toekomst misschien eens mee experimenteren?