(1) You can compute pixel metric. That is, in QGraphicsItem's local coordinates "1 pixel is x (qreal) long and y (qreal) tall" (I wonder if it's not as simple as 1=1.0)
Then, according to your image dimensions (in pixels), you know that a QPointF given in item's coordinate match with a pixel in your image (apply pixel metric and cast it to QPoint).

(2) Now, given QPoints in view's coordinate system (for instance its viewport corners), map it to the GraphicsItem local coordinate system and make (1). This should give you the corresponding image rect currently visible.

(3) As you said, zooming out might make the image fully visible in the viewer (and maybe surrounded with 'empty' space); In this case mapping your viewport to GraphicsItem local coordinates will compute out-of-bounds pixel indices. But this is the idea