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

Вопрос:здесь у меня есть сцена и связанный с ним вид, тогда я hava позиция в координатах сцены. Я хочу установить центр окна просмотра с позицией. Как я могу это сделать? Я пытаюсь использовать функцию translate(), но это не сработало? view->translate(10, 10); Окно просмотра должно перемещаться с дельта x 10 и дельта y 10, но это

Вопрос:

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

view->translate(10, 10);

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

Ответ №1Содержание

  1. Центр
  2. Перевести
  3. Рендер

Центр

Как сказал Фрэнк Остерфелд, чтобы сосредоточить свой видовой экран на заданной позиции, вы можете просто использовать функцию 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 ); Ответ №2

См. отчет об ошибке а также обход.

Ответ №3

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

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, может отличаться от более новых версий.

Ответ №4

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

setTransformationAnchor(QGraphicsView::NoAnchor);

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

Оцените статью
Добавить комментарий