Название: QGraphicsView, zoom и центрирование при setMatrix Отправлено: CyclicBarrier от Декабрь 01, 2013, 12:45 Делаю zoom у QGraphicsView через setMatrix, но центр того видимого куска который был до zoom съезжает в или вверх-влево или вниз-вправо в зависимости от направления zoom. Пробую после zoom применить centerOn(const QPointF&), но не получается точно рассчитать новую координату этого центра.
Вопрос, как можно вычислить новую координату после zoom которую можно подсунуть centerOn(const QPointF&)? Есть какая нибудь формула? Название: Re: QGraphicsView, zoom и центрирование при setMatrix Отправлено: Hrundel от Декабрь 02, 2013, 14:36 а чем не подходит scale:
Код
Название: Re: QGraphicsView, zoom и центрирование при setMatrix Отправлено: CyclicBarrier от Декабрь 02, 2013, 18:09 а чем не подходит scale: Не подходит тем, что разницы между scale и setMatrix никакой, в обоих случаях сцена съезжает. Название: Re: QGraphicsView, zoom и центрирование при setMatrix Отправлено: sergeyostu от Январь 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 у вида используют приватные переменные для пересчета. Буду благодарен если у кого-то будут идеи |