Russian Qt Forum
Ноябрь 01, 2024, 04:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QGraphicsView, zoom и центрирование при setMatrix  (Прочитано 5541 раз)
CyclicBarrier
Гость
« : Декабрь 01, 2013, 12:45 »

Делаю zoom у QGraphicsView через setMatrix, но центр того видимого куска который был до zoom съезжает в или вверх-влево или вниз-вправо в зависимости от направления zoom. Пробую после zoom применить centerOn(const QPointF&), но не получается точно рассчитать новую координату этого центра.
Вопрос, как можно вычислить новую координату после zoom которую можно подсунуть centerOn(const QPointF&)? Есть какая нибудь формула?
Записан
Hrundel
Гость
« Ответ #1 : Декабрь 02, 2013, 14:36 »

а чем не подходит scale:
Код
C++ (Qt)
QGraphicsView* zoomArea;
 
void zoomIn()
{
zoomArea->scale(1.1, 1.1);
}
 
void zoomOut()
{
zoomArea->scale(1/1.1, 1/1.1);
}
Записан
CyclicBarrier
Гость
« Ответ #2 : Декабрь 02, 2013, 18:09 »

а чем не подходит scale:

Не подходит тем, что разницы между scale и setMatrix никакой, в обоих случаях сцена съезжает.
Записан
sergeyostu
Гость
« Ответ #3 : Январь 31, 2017, 13:15 »

Блин, моя проблема!
Вообще конечно затыка, просто пипец, неужели положение сцены нельзя было отдать на откуп юзеру API?
Просто за последние два года который раз пробую реализовать нормальный зум на GrapicsView все бесполезно.
Краткий лекбез
Поведение сцены при масштабировании (конечно при любых трансформациях) текущая версия Qt 5.7
за это отвечают три свойства:

alignment : Qt::Alignment
transformationAnchor : ViewportAnchor
resizeAnchor : ViewportAnchor

читаем внимательно справку по, ним немного недоумеваем, вот примерный перевод:
alignment : Qt::Alignment
Это свойство отвечает за выравнивание сцены на виде, в тех случаях когда сцена полностью видима
Если сцена полностью видна на виде (то есть скролы не видны) это свойство определяет как будет отображена сцена на виде.
Например, если свойство имеет значение Qt::AlignCenter, которое стоит по умолчанию, сцена будет центрирована относительно вида,
а если свойство имеет значение (Qt::AlignLeft | Qt::AlignTop) сцена будет отображена в левом верхнем углу вида

transformationAnchor : ViewportAnchor
Это свойство отвечает за то как вид позиционируется относительно сцены во время преобразований (в частности при масштабировании)
QGraphicsView использует это свойство для определения положения сцены во viewport (это член класса QGraphicsView), во время преобразований.
Значение по-умолчанию этого свойства AnchorViewCenter, при это точка сцены находящаяся под центром вида не смещается относительно центра вида во время преобразования (то есть при операции вращения сцена вращается относительно центра вида).
ЗАМЕЧАНИЕ это свойство работает только тогда, когда часть сцены отображается на виде (то есть когда видны скролы). Иначе, если сцена полностью видна на виде используется свойство  alignment для позиционирования сцены на виде.

resizeAnchor : ViewportAnchor
Здесь аналогично предыдущему работает при ресайзе виджета.

Подумав немного приходит в голову такой в принципе рабочий вариант:
при инициализации сцены выставить ей очень большой размер:
qreal sz = 1e105
scene()->setSceneRect(-sz/2,-sz/2, sz, sz);
вроде масштаб при центрировании работает правильно то есть мы никогда не попадаем в ситуацию когда работает свойство  alignment
однако есть НО, сразу появляются скролы на пустой сцене для меня критично ибо делаю что-то вроде 2D редактора, схем придется искать в бесконечном месте кусочек маленький.
Есть идея ресайзить Rect сцены если она полностью внутри вида, но это надо делать до изменения масштаба однако в ручную это сделать правильно не получатеся из-за того, что функции Map у вида используют приватные переменные для пересчета.
Буду благодарен если у кого-то будут идеи
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.141 секунд. Запросов: 21.