Das klingt gut und schlecht gleichzeitig

Die Idee, auf die du da gekommen bist, ist an sich erstmal gut. Das wuerde man als Modellbezeichnen, also eine reine Datenrepraesentation von dem, was dein Programm eigentlich darstellt. Und dann durch einen View wird das Modell dargestellt. Soweit, so gut. Das kann dann auch gespeichert und geladen werden, will man ja auch.
Die Sache mit den IDs, die dann die Schluessel dict sind, da wird's sketchy. Da du deine Operationen immer in einer definierten Reihenfolge abarbeiten musst, ist die richtige Datenstruktur eine Liste. Von der kannst du fuer UNDO dann ein Element abknapsen, und dann das ganze neu rendern. Oder aber, und das wird im Zweifel effizienter: du speicherst die Informationen, die du brauchst, wie zB Zeiger/Referenze auf die eigentlichen QGraphicsScene-Objekte, die erzeugt wurden, und wenn UNDO kommt, entfernst du die, statt alles neu zu malen. Das waere dann das eher klassiche Command-Pattern fuer Undo, weil es zu jedem Kommando (Linie malen) ein UNDO-Kommando (Linie loeschen) gibt.