Я не пытаюсь восстановить определенный вид (видимую область) в подклассе QGraphicsView на подклассе QGraphicsScene.
Видимый прямоугольник просматриваемой сцены должен быть
mapToScene( rect() ).boundingRect()
который
QRectF(27.8261,26.9565 673.043x507.826)
Я получаю эти значения в деструкторе QGraphicsView, они кажутся действительными.
После восстановления геометрии окна я использую указанные значения в первом QGraphicsView :: resizeEvent (первое событие имеет недопустимый старый размер QSize(-1, -1)
) в попытке восстановить область, показанную в поле зрения, используя
fitInView( QRectF(....) , Qt::IgnoreAspectRatio);
Это вызывает несколько событий scrollContentsBy перед тем, как показывать представление, другое изменение размера и прокручивать событие после, затем загорается showwindows mainwindow, вызывая больше изменений прокрутки и изменения размера. Я уверен, что эта последовательность необходима для построения графического интерфейса GUI, но теперь я запутался в том, как я могу запустить fitInView, как только все будет настроено.
Используя QTimer :: singleShot, чтобы запустить функцию после отображения GUI, я получаю приблизительно желаемый результат, но матрица и область просмотра различаются:
ui->graphicsView->matrix();
ui->graphicsView->mapToScene( ui->graphicsView->rect()).boundingRect();
До:
"[m11=1 m12=0 m21=0 m22=1 dx=0 dy=0] (x=27 y=27 w=774 h=508)"
Восстановлен
"[m11=0.954724 m12=0 m21=0 m22=0.954724 dx=0 dy=0] (x=17.8062 y=24.0907 w=810.705 h=532.091)"
Поэтому fitInView() не очень хорошо служит моей цели - есть ли другой, надежный способ?
Я использую Qt 4.8.1 с MSVC2010
Другой подход заключается в том, чтобы восстановить положение прокрутки и окна так:
settings->setValue("view", mapToScene( rect() ).boundingRect() );
settings->setValue("transform", transform() );
settings->sync();
и восстановить их
QTransform trans = settings->value("transform", QTransform()).value<QTransform>();
QRectF view = settings->value( "view", QRectF() ).value<QRectF>();
setTransform( trans );
centerOn( view.center() );
Но этот метод тоже имеет смещение.
До
"[m11=4.96282 m12=0 m21=0 m22=4.96282 dx=0 dy=0] (x=29.6203 y=29.4188 w=155.96 h=104.981)"
После
"[m11=4.96282 m12=0 m21=0 m22=4.96282 dx=0 dy=0] (x=54.8076 y=53.8001 w=155.96 h=104.981)"
Смещение также присутствует, когда полосы прокрутки скрыты. Перемещение кода в showEvent() не влияет на результат.
Что, наконец, работает: в showEvent, восстановить преобразование, восстановить значения полосы прокрутки:
setTransform( trans );
verticalScrollBar()->setValue( v );
horizontalScrollBar()->setValue( h );
Видимость полосы прокрутки не влияет на позицию и размер представления, они просто "накладываются".
fitInView( QRectF(....) , Qt::IgnoreAspectRatio);
- Я изменил это на Qt :: KeepAspectRatio, чтобы обеспечить одинаковые значения масштаба матрицы преобразования.