Задание точной области просмотра (прямоугольника) QGraphicsScene в QGraphicsView - лучше подходит FitInView ()?

0

Я не пытаюсь восстановить определенный вид (видимую область) в подклассе 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() не влияет на результат.

  • 0
    Относительно fitInView( QRectF(....) , Qt::IgnoreAspectRatio); - Я изменил это на Qt :: KeepAspectRatio, чтобы обеспечить одинаковые значения масштаба матрицы преобразования.
  • 0
    Отключение полос прокрутки в представлении немного помогает (масштабная разница около 0,01, смещение позиции около 2-8 пикселей).
Показать ещё 1 комментарий
Теги:
qt4

1 ответ

0

Что, наконец, работает: в showEvent, восстановить преобразование, восстановить значения полосы прокрутки:

setTransform( trans );
verticalScrollBar()->setValue( v );
horizontalScrollBar()->setValue( h );

Видимость полосы прокрутки не влияет на позицию и размер представления, они просто "накладываются".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню