In fact, you don't have to implement any of the transformations I described in the arrow class itself. All the arrow class has to do is to draw a "unit arrow" pointing from left to right.

The scene (or whatever graphics item contains the arrow as a child) is responsible for transforming it to the right size, pointing in the right direction. You create the arrow shaft and head in the constructor with unit dimensions, and paint them that way in the paint() method. The QPainter instance that comes into the paint() method has already been transformed to draw the arrow the way it is supposed to appear on screen.

So your arrow class simplifies to just the paint() method, and the bounding rect is simply the constant bounds of the unit arrow. You don't have to implement any behavior that responds to changes in size or direction - that's the responsibility of the scene or parent item.

All you have to decide is where the origin of your arrow will be. Where is (0,0) on the unit arrow? At the start of the line, tip of the arrowhead, or somewhere in between? This might depend on how you anticipate using the arrow - will it be used to point at something, or away from something? If it points at something, then you probably want the origin to be at the tip, otherwise it should be at the start of the line. Whichever you decide, it would be nice to add some convenience functions to return the QPoints corresponding to each end of the arrow so if you use it to connect two things, you can easily get both ends and convert them to screen positions.