The origin for the QGraphicsEllipseItem is in the center of the ellipse. When you create this, the first two arguments are the position of the circle with respect to its parent, which in this case is the scene. So you are telling the scene that the circle's center goes at the scene's origin.

When you put the scene into a QGraphicsView, the view will automatically center the scene in the view and size it so the view contains the scene's bounding box. So if all you have in the scene is the circle, the view's top left scene coordinate is (-radius, -radius), the circle fills the view, and sits at the view's center.

When you create the North symbol, the coordinates are also with respect to the scene since the symbol has no parent. So now you have a circle at (0, 0) and a symbol at (radius - spacing/2, 0). When this is put into the view, the view still has the scene's (-radius, -radius) as the top left corner, and the circle's center appears to be at the center of view (which it is) because the view adds (radius, radius) to the coordinates as it scales and centers the scene.

The origin (0, 0) coordinates for the QGraphicsProxyWidget are at the top left corner of the proxy, not the center as for the circle. So setting the position to (radius + spacing / 2, 0) means that the x dimension of the proxy will be centered on the circle's center, and the top will be at the top of the circle, in scene coordinates.

That's exactly what you get in your first screenshot.

In the second screenshot, you have moved the top of the proxy widget up (negative Y is up) by the size of the proxy plus some offset. Now the bounding box of the scene is larger, so when the view scales and centers the scene, the top left corner of the view corresponds to the scene coordinates (-radius, -radius - spacing - offset), and the size of the scene displayed in the view goes from this top left scene coordinate to (+radius, +radius) on the bottom right.

If the size of your view does not change, then this makes the circle smaller and it appears to be "pushed down" in the view because of the view's scaling and translation of the scene.

The important thing to remember about the Graphics / View architecture is that all coordinates are defined relative to the parent of each item in the scene, not the view. If an item is a top-level item in the scene, then its coordinates are scene coordinates. If an item is a child of another item, then its position is relative to the origin of the parent item.

If you make your N symbol a child of the circle, and give it the position (0,0), then the top left of the symbol would sit at the circle's center (because the symbol's origin (0,0) is the top left of the symbol, while the circle's origin is at its center. If you move the circle to a new position in the scene, the N symbol will move with it, since it is a child of the circle.

You can control what part of the scene is displayed in the view and how the scaling and translation works by using one of the QGraphicsView::setSceneRect() or QGraphicsView::fitInView() methods.

By the way, you do know that there is a QGraphicsPixmapItem that can directly hold your JPG without a proxy, right?