Следующая реализация вернула мне лучшие результаты:
QRectF getVisibleRect( QGraphicsView * view )
{
QPointF A = view->mapToScene( QPoint(0, 0) );
QPointF B = view->mapToScene( QPoint(
view->viewport()->width(),
view->viewport()->height() ));
return QRectF( A, B );
}
Это все еще очень хорошо работает, когда появляются полосы прокрутки. Это работает только в том случае, если вид не отображает сцену повернутую или сдвинутую. Если вид поворачивается или сдвигается, то видимый прямоугольник не является параллельным оси в системе координат сцены. В этом случае
view->mapToScene( view->viewport()->geometry() )
возвращает QPolygonF
(НЕ QRectF
), который является видимым прямоугольником в координатах сцены. Кстати, QPolygonF
имеет функцию-член boundingRect()
, которая не возвращает правильно видимый прямоугольник вида, но может быть полезна в любом случае.