Weil du nen QPainter nur im paintEvent erstellen kannst. Und das paintEvent ist ja auch immer gebunden an dein Objekt.
Wenn du in einem WidgetA::paintEvent() den Painter auf WidgetB startest, gerschieht dies ja nicht im paintEvent von WidgetB.
Du kannst also nicht einfach auf ein fremdes Widget deinen Painter legen und drauf los malen.
Du kannst dir natürlich eine Schnittstelle definieren, mit der du vorgegebene Sachen auf das fremde WidgetB zeichnest (diese API muss natürlich das fremde WidgetB anbieten). Diese ändern aber den internen State des anderen Widget und rufen update() auf, womit dann das paintEvent des anderen WidgetB die neuen schönen Sachen malen kann.