Im Moment zeichnest du direkt auf dem QTextEdit-Oberfläche (// edit: sry, tust du nicht, du legst einfach ein Widget irgendwo hin

). Ein QTextEdit erbt von QAbstractScrollArea, die wiederum von QFrame. Der Frame ist das "außenrum", die ScrollArea für ScrollBars hinzu. Der eigentliche Inhalt (das Widget, auf dem der Text gemalt wird) liegt auf einem separaten Widget, dem viewport. Das paintEvent der ScrollArea mappt jenes auf den viewport, abhängig von der eigenen Größe, der Position der ScrollBars usw.
Wenn du selber etwas dazumalen willst, sollst du nun auf den viewport malen. Du willst ja, dass die Zeilennummern zum Inhalt passen, deshalb musst du das auch dort malen wo der Inhalt gemalt wird (grob).