I am not a PyQt5 expert, but I see a few questionable things.

Zeroth: You are using the name "pixmap" to refer to two completely different things: a QPixmap (inside the Photo class) and the parent Photo instance (inside the PixmapController class). This is really confusing and when I first read your code I thought you were making a copy of the QPixmap. It would be more clear (and probably less confusing to you also) if you changed the name to "photo" in the PixmapController class to make it clear you are manipulating the parent object.

First, I think you should be creating your PixmapController instance in the Photo constructor. You don't need to create a new one every time your load the pixmap, you just need to move the existing one so it is at the top left corner of the new pixmap.

Second, it doesn't seem to me that you are keeping the handle position at the top left when you rotate. When you process the ItemPositionChange signal, you do rotate the parent, but then you call the superclass method which will move the handle relative to the Photo. I think you should only be calling the superclass method when the change is not an ItemPositionChange.