Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: OS2 от Август 22, 2014, 17:44



Название: Проблема с зумирование QGraphicsView
Отправлено: OS2 от Август 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 ) для того, чтобы область(центр) масштабирования находилась под указателем мыши.
Все вроде нормально работает, но до поры, до времени: при уменьшении масштаба сцена начинает выравниваться по центру вида становясь все меньше и меньше, не реагируя уже на то, где реально находится указатель мыши. Но мне необходимо, чтобы при уменьшении масштаба сцена находилась именно там, где находится курсор, а не поцентру окна\вида.

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

Всем заранее спасибо!


Название: Re: Проблема с зумирование QGraphicsView
Отправлено: _OLEGator_ от Август 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.


Название: Re: Проблема с зумирование QGraphicsView
Отправлено: OS2 от Август 22, 2014, 18:54
Цитировать
Можно посмотреть на предмет флага
Да уж искал, искал, к сожалению ничего вразумительного не нашел... (кроме вышеупомянутого QGraphicsView::AnchorUnderMouse)

Цитировать
либо вручную увеличить размеры сцены
Не понял, что ты имеешь в виду?


Название: Re: Проблема с зумирование QGraphicsView
Отправлено: _OLEGator_ от Август 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 )


Название: Re: Проблема с зумирование QGraphicsView
Отправлено: OS2 от Август 22, 2014, 18:57
Цитировать
alignment : Qt::Alignment
This property holds the alignment of the scene in the view when the whole scene is visible.
Да, это я видел, но это выравнивание позволяет прижимать сцену к краям или центрировать, как управлять её положением програмно (располагая строго под курсором) - неясно.


Название: Re: Проблема с зумирование QGraphicsView
Отправлено: OS2 от Август 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 )
И как их можно использовать в моём случае?


Название: Re: Проблема с зумирование QGraphicsView
Отправлено: _OLEGator_ от Август 22, 2014, 19:20
Вручную задать достаточно большой размер сцены, чтобы при минимальных масштабах сцена не помещалась во вьювер - тогда не будет центрирование сцены.


Название: Re: Проблема с зумирование QGraphicsView
Отправлено: OS2 от Август 22, 2014, 19:31
К сожалению это не помогает.


Название: Re: Проблема с зумирование QGraphicsView
Отправлено: _OLEGator_ от Август 22, 2014, 19:39
Показывай, как делаешь.
Крайним вариантом остается посмотреть как и где применяется центрирование в исходниках вьювера и можно ли эту функцию переопределить.

Посмотрел. Функция приватная - void QGraphicsViewPrivate::recalculateContentSize() - изменить никак нельзя.
С ручным увеличением прямоугольника сцены должно работать. Нужен код, может делаешь что не так.


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


Название: Re: Проблема с зумирование QGraphicsView
Отправлено: _OLEGator_ от Август 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);


Название: Re: Проблема с зумирование QGraphicsView
Отправлено: OS2 от Август 24, 2014, 13:34
Пробовал уже, к сожалению не помогает.