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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Zoom, QGraphicsView::scale(float, float)  (Прочитано 2462 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« : Сентябрь 14, 2022, 11:01 »

Доброго дня!


zoom.h
Код
C++ (Qt)
 
/*!
* This class adds ability to zoom QGraphicsView using mouse wheel. The point under cursor
* remains motionless while it's possible.
*
* Note that it becomes not possible when the scene's
* size is not large enough comparing to the viewport size. QGraphicsView centers the picture
* when it's smaller than the view. And QGraphicsView's scrolls boundaries don't allow to
* put any picture point at any viewport position.
*
* When the user starts scrolling, this class remembers original scene position and
* keeps it until scrolling is completed. It's better than getting original scene position at
* each scrolling step because that approach leads to position errors due to before-mentioned
* positioning restrictions.
*
* When zommed using scroll, this class emits zoomed() signal.
*
* Usage:
*
*   new Graphics_view_zoom(view);
*
* The object will be deleted automatically when the view is deleted.
*
* You can set keyboard modifiers used for zooming using set_modified(). Zooming will be
* performed only on exact match of modifiers combination. The default modifier is Ctrl.
*
* You can change zoom velocity by calling set_zoom_factor_base().
* Zoom coefficient is calculated as zoom_factor_base^angle_delta
* (see QWheelEvent::angleDelta).
* The default zoom factor base is 1.0015.
*/

 
#include <QObject>
#include <QGraphicsView>
class Graphics_view_zoom : public QObject {
 Q_OBJECT
public:
 Graphics_view_zoom(QGraphicsView* view);
 void gentle_zoom(double factor);
 void set_modifiers(Qt::KeyboardModifiers modifiers);
 void set_zoom_factor_base(double value);
 
private:
 QGraphicsView* _view;
 Qt::KeyboardModifiers _modifiers;
 double _zoom_factor_base;
 QPointF target_scene_pos, target_viewport_pos;
 bool eventFilter(QObject* object, QEvent* event);
 
signals:
 void zoomed();
};
 
zoom.cpp
 

Код
C++ (Qt)
#include "Graphics_view_zoom.h"
#include <QMouseEvent>
#include <QApplication>
#include <QScrollBar>
#include <qmath.h>
 
Graphics_view_zoom::Graphics_view_zoom(QGraphicsView* view)
 : QObject(view), _view(view)
{
 _view->viewport()->installEventFilter(this);
 _view->setMouseTracking(true);
 _modifiers = Qt::ControlModifier;
 _zoom_factor_base = 1.0015;
}
 
void Graphics_view_zoom::gentle_zoom(double factor) {
 _view->scale(factor, factor);
 _view->centerOn(target_scene_pos);
 QPointF delta_viewport_pos = target_viewport_pos - QPointF(_view->viewport()->width() / 2.0,
                                                            _view->viewport()->height() / 2.0);
 QPointF viewport_center = _view->mapFromScene(target_scene_pos) - delta_viewport_pos;
 _view->centerOn(_view->mapToScene(viewport_center.toPoint()));
 emit zoomed();
}
 
void Graphics_view_zoom::set_modifiers(Qt::KeyboardModifiers modifiers) {
 _modifiers = modifiers;
 
}
 
void Graphics_view_zoom::set_zoom_factor_base(double value) {
 _zoom_factor_base = value;
}
 
bool Graphics_view_zoom::eventFilter(QObject *object, QEvent *event) {
 if (event->type() == QEvent::MouseMove) {
   QMouseEvent* mouse_event = static_cast<QMouseEvent*>(event);
   QPointF delta = target_viewport_pos - mouse_event->pos();
   if (qAbs(delta.x()) > 5 || qAbs(delta.y()) > 5) {
     target_viewport_pos = mouse_event->pos();
     target_scene_pos = _view->mapToScene(mouse_event->pos());
   }
 } else if (event->type() == QEvent::Wheel) {
   QWheelEvent* wheel_event = static_cast<QWheelEvent*>(event);
   if (QApplication::keyboardModifiers() == _modifiers) {
     if (wheel_event->orientation() == Qt::Vertical) {
       double angle = wheel_event->angleDelta().y();
       double factor = qPow(_zoom_factor_base, angle);
       gentle_zoom(factor);
 
 
       qDebug() << _view->sceneRect(); //текущий размеры размер сцены не меняется???
       return true;
     }
   }
 }
 Q_UNUSED(object)
 return false;
}
 

Выше приведенный код взял
Код:
https://stackoverflow.com/questions/19113532/qgraphicsview-zooming-in-and-out-under-mouse-position-using-mouse-wheel

Там есть такое примечание что
Код:
Обратите внимание, что это становится невозможным, когда сцена
размер недостаточно велик по сравнению с размером области просмотра. QGraphicsView центрирует изображение
когда он меньше представления. И границы прокрутки QGraphicsView не позволяют
 поместите любую точку изображения в любую позицию окна просмотра.

В моем случае получалось так что при прокрутке скролла текущий размеры сцены не меняется почему-то...
Код
C++ (Qt)
...
qDebug() << view->sceneRect();
 
 

Как сделать, чтобы когда размер сцены меньше размера области промотра QGraphicsView не центрировал изображение,
а размещал его в левом верхнем углу области просмотра?

« Последнее редактирование: Сентябрь 14, 2022, 11:22 от demaker » Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #1 : Сентябрь 20, 2022, 10:26 »

Решил вопрос с центрированием сцены Смеющийся
Код
C++ (Qt)
QGraphicsView::setAlignment(Qt::Alignment alignment)
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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