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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с зумирование QGraphicsView  (Прочитано 9153 раз)
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« : Август 22, 2014, 17:44 »

Всем доброго времени суток.

Прошу помочь с следующей проблемой:
имеется вид, на которую помещена сцена с размещенными на ней QGraphicsItem’ами. При помощи wheelEvent( QWheelEvent* ) перехватываю соответствующее событие мыши и масштабирую вид:
Код
C++ (Qt)
void My_GraphicsView::wheelEvent( QWheelEvent* qevent )
{
 if( qevent->buttons() != Qt::MidButton )
 {
 if( !(qevent->modifiers() & Qt::ControlModifier) )
 {
   if( qevent->delta() > 0 )
   {
     qreal factor = transform().scale( dCoeff, dCoeff ).mapRect(QRectF(0, 0, 1, 1)).width();
     if( factor < 0.07 || factor > 100 ) return;
     scale( dCoeff, dCoeff );
   }
   else
   {
     qreal factor = transform().scale( dCoeff, dCoeff ).mapRect(QRectF(0, 0, 1, 1)).width();
     if( factor < 0.07 || factor > 100 ) return;
     scale( dCoeff, dCoeff );
   }
 }
 else
 {
   QAbstractScrollArea::wheelEvent( qevent );
 }
}
 
Перед этим выставляю setTransformationAnchor( QGraphicsView::AnchorUnderMouse ) для того, чтобы область(центр) масштабирования находилась под указателем мыши.
Все вроде нормально работает, но до поры, до времени: при уменьшении масштаба сцена начинает выравниваться по центру вида становясь все меньше и меньше, не реагируя уже на то, где реально находится указатель мыши. Но мне необходимо, чтобы при уменьшении масштаба сцена находилась именно там, где находится курсор, а не поцентру окна\вида.

Может кто знает как с этим бороться?

Всем заранее спасибо!
Записан
_OLEGator_
Гость
« Ответ #1 : Август 22, 2014, 18:47 »

Механизма вьювера видимо центрует вид, если сцена по своим размерам меньше вьювера в текущем масштабе.
Можно посмотреть на предмет флага, чтобы изменить такое поведение, возможно он есть, либо вручную увеличить размеры сцены, документация говорит, что (INT_MIN, INT_MAX) будет восприниматься как бесконечный размер.
Цитировать
alignment : Qt::Alignment
This property holds the alignment of the scene in the view when the whole scene is visible.

If the whole scene is visible in the view, (i.e., there are no visible scroll bars,) the view's alignment will decide where the scene will be rendered in the view. For example, if the alignment is Qt::AlignCenter, which is default, the scene will be centered in the view, and if the alignment is (Qt::AlignLeft | Qt::AlignTop), the scene will be rendered in the top-left corner of the view.
« Последнее редактирование: Август 22, 2014, 18:54 от _OLEGator_ » Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #2 : Август 22, 2014, 18:54 »

Цитировать
Можно посмотреть на предмет флага
Да уж искал, искал, к сожалению ничего вразумительного не нашел... (кроме вышеупомянутого QGraphicsView::AnchorUnderMouse)

Цитировать
либо вручную увеличить размеры сцены
Не понял, что ты имеешь в виду?
Записан
_OLEGator_
Гость
« Ответ #3 : Август 22, 2014, 18:57 »

Код
C++ (Qt)
void QGraphicsView::setSceneRect ( qreal x, qreal y, qreal w, qreal h )
void QGraphicsScene::setSceneRect ( qreal x, qreal y, qreal w, qreal h )
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #4 : Август 22, 2014, 18:57 »

Цитировать
alignment : Qt::Alignment
This property holds the alignment of the scene in the view when the whole scene is visible.
Да, это я видел, но это выравнивание позволяет прижимать сцену к краям или центрировать, как управлять её положением програмно (располагая строго под курсором) - неясно.
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #5 : Август 22, 2014, 18:59 »

Код
C++ (Qt)
void QGraphicsView::setSceneRect ( qreal x, qreal y, qreal w, qreal h )
void QGraphicsScene::setSceneRect ( qreal x, qreal y, qreal w, qreal h )
И как их можно использовать в моём случае?
Записан
_OLEGator_
Гость
« Ответ #6 : Август 22, 2014, 19:20 »

Вручную задать достаточно большой размер сцены, чтобы при минимальных масштабах сцена не помещалась во вьювер - тогда не будет центрирование сцены.
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #7 : Август 22, 2014, 19:31 »

К сожалению это не помогает.
Записан
_OLEGator_
Гость
« Ответ #8 : Август 22, 2014, 19:39 »

Показывай, как делаешь.
Крайним вариантом остается посмотреть как и где применяется центрирование в исходниках вьювера и можно ли эту функцию переопределить.

Посмотрел. Функция приватная - void QGraphicsViewPrivate::recalculateContentSize() - изменить никак нельзя.
С ручным увеличением прямоугольника сцены должно работать. Нужен код, может делаешь что не так.
« Последнее редактирование: Август 22, 2014, 19:52 от _OLEGator_ » Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #9 : Август 24, 2014, 10:27 »

Да вобщем-то код с зумированием приведен в первом посте, а сцену просто увеличиваю при её создании, примерно так:
Код
C++ (Qt)
int n = ....;
QGraphicsView::setSceneRect( 0.0, 0.0, sceneRect().width()*n, sceneRect().height()*n );
или я не так понял твою мысль с ручным увеличением?
Записан
_OLEGator_
Гость
« Ответ #10 : Август 24, 2014, 11:34 »

Надо и левый верхний угол смещать в отрицательную четверть.
Грубо говоря так:
Код
C++ (Qt)
QGraphicsView::setSceneRect(-sceneRect().width()*n, sceneRect().height()*n, sceneRect().width()*n, sceneRect().height()*n );

Попробуй вообще выставить "бесконечные" размеры:
Код
C++ (Qt)
QGraphicsView::setSceneRect(INT_MIN, INT_MIN, INT_MAX, INT_MAX);
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #11 : Август 24, 2014, 13:34 »

Пробовал уже, к сожалению не помогает.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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