Переопределил метод прокрутки колесом в наследнике QGraphicsView, в котором использую метод QGraphicsView::scale(k,k)
| Код | void MMGraphicsView::wheelEvent(QWheelEvent *event) { if (event->delta() == 0) return; // на всякий случай
QPointF focusScenePos = mapToScene(event->pos()); // получаю точку на сцене под курсором
qreal k; if (event->delta() > 0) k = 1.1; else k = 1 / 1.1; if (transform().m11() * k < 0.01 || 1E6 < transform().m11() * k) return; // границы для коэффициента скейлинга scale(k,k); // и вот он скейлинг!!! теперь под курсором другая область сцены
QPointF deltaPos = mapToScene(event->pos()) - focusScenePos; // вычисляю смещение в координатах сцены QPointF centerScenePos = mapToScene(width()/2.0, height()/2.0); // получаю точку сцены в центре вьюпорта centerOn(centerScenePos - deltaPos); перемещаю центр с учетом вычисленного смещения
scene()->setSceneRect(scene()->itemsBoundingRect()); // отсекаю лишнее пространство, появившееся при увеличении после сильного уменьшения }
|
В итоге работает все как-то не так: точка на сцене не возвращается под курсор, где была ранее. Может кто-то уже реализовывал подобный механизм - подскажите что я делаю не так?
|