Как использовать функцию перевода QGraphicsView()?

здесь у меня есть сцена и связанный вид, затем у меня есть позиция в координатах сцены. Я хочу установить центр области просмотра с позицией. Как я могу это сделать? Я пытаюсь использовать функцию translate(), но она не работает?

view->translate(10, 10);

Окно просмотра должно двигаться с дельтой x 10 и дельтой y 10, но это не сработало!


person Ticks    schedule 30.01.2013    source источник
comment
Используйте QGraphicsView::centerOn для центрирования. Что именно не получилось в переводе? Какова текущая позиция области просмотра и размеры вашей сцены (sceneRect())?   -  person Frank Osterfeld    schedule 31.01.2013
comment
Я вижу то же самое. Я могу установить переведенный QTransform или использовать QGraphicsView::translate(), и ничего не произойдет. Немного расстраивает.   -  person Cory Klein    schedule 10.08.2013


Ответы (4)


Вам необходимо установить режим привязки преобразования графического представления на NoAnchor.

setTransformationAnchor(QGraphicsView::NoAnchor);

Это предотвращает отмену перевода в графическом представлении, как ожидается другими режимами привязки (AnchorViewCenter, AnchorUnderMouse).

person Gearoid Murphy    schedule 27.04.2019

Центр

Как сказал Франк Остерфельд, чтобы центрировать окно просмотра в заданной позиции, вы можете просто использовать функцию centerOn.

Перевести

Но для перевода окна просмотра существует другой способ, который заключается в изменении положения полос прокрутки:

// Your graphics view
QGraphicsView *view;

// dx, dy corresponds to your translation
int dx, dy;

// Change scrollbars position
view->horizontalScrollBar()->setValue( view->horizontalScrollBar()->value() + dx );
view->verticalScrollBar()->setValue( view->verticalScrollBar()->value() + dy );

Оказывать

При необходимости вы также можете скрыть полосы прокрутки:

// Hide the scrollbars
view->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
view->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
person Rémi    schedule 31.07.2017

Я использовал следующий обходной путь:

QTransform old_transform = transform();

QRectF scene_rect = scene()->sceneRect();
QRectF new_scene_rect(scene_rect.x()-translation.x(),
                      scene_rect.y()-translation.y(),
                      scene_rect.width(),scene_rect.height());
scene()->setSceneRect(new_scene_rect);

setTransform(old_transform);

Часть преобразования была необходима, так как в противном случае она сбрасывает масштабирование.

Это решение, по сути, заставляет его измениться там, где ему разрешено смотреть, что далеко не элегантно.

Я надеюсь, что кто-то еще даст четкий ответ, который позволит использовать метод translate по назначению.

Обратите внимание, что я использую Qt 4.85, в более новых версиях может быть по-другому.

person Aziuth    schedule 29.03.2018

См. отчет об ошибке, а также обходные пути.

person user2802681    schedule 21.09.2013
comment
Полезно обобщить вывод, сделанный по ссылке в вашем ответе. - person krsteeve; 21.09.2013